我是Python的初学者。我以前学过其他语言,如C++(初学者)和jQuery。但是我发现python中的循环相当混乱。在
我想得到一个简单的结果。程序将循环遍历一个单词列表,然后将删除与列表中第一个字母和下一个单词匹配的单词:
test = ['aac', 'aad', 'aac', 'asd', 'msc']
for i in range(len(test)):
if test[i][0:2] == test[i+1][0:2]:
test.remove(test[i])
# This should output only ['aac', 'asd', 'msc']
print test
上面的代码应该从列表中删除'aac'
和{IndexError
。而且,我没能达到预期的效果。你能解释一下吗?在
当您从列表中删除项时,
range(len(test))
仍然保持相同的值。因此,即使您的test
列表只剩下一个项目,循环仍在继续。在我有两个解决方案:
将您想要的项目复制到新列表中,因此不要删除它:
别忘了扭转局面。
向后循环。像这样:
^{pr2}$或者,正如martijn所说:
希望有帮助!在
抱歉,我之前的回答很愚蠢
正如其他人所说,当您删除项时,列表会变短,从而导致索引错误。在
与原问题保持一致。如果你想用列表.删除从列表中重复找到的项,然后将它们从列表中删除:
编辑:
根据马丁斯的评论,你不需要列出第二个需要删除的项目列表,你可以列出一个不需要删除的项目,如下所示:
^{pr2}$在循环到列表起始长度的范围内循环时,正在更改列表的长度;从列表中删除一项,最后一个索引将不再有效。在
Moveover,因为在当前索引处从列表中删除了项,所以其余的列表索引现在位于索引
i + 1
处的索引现在位于索引i
,因此循环索引不再有用。在最后但并非最不重要的是,循环到最后一个索引};即使没有从列表中删除元素,该索引也不存在。在
test
,但是仍然尝试访问{您可以使用
while
循环来实现您想要的操作:现在,
i
在每次循环迭代的新长度下进行测试,如果没有删除元素,我们只增加i
。注意,循环的长度限制为减1,因为您要测试每个迭代的test[i + 1]
。在请注意,我使用
del test[i]
;无需在列表中搜索该值以再次删除;如果值多次出现在列表中,但只有以后的实例才应被删除,则这也可能导致细微的错误;例如,['aac', 'foo', 'aac', 'aad']
应导致['aac', 'foo', 'aad']
,而不是['foo', 'aac', 'aad']
,这就是test.remove(test[i])
将产生的结果。在演示:
^{pr2}$您可以使用列表理解来避免列表缩小问题:
这两种方法都只需要通过输入列表进行一次循环。在
相关问题 更多 >
编程相关推荐