我有一个给定格式的列表:
[['John', 'Smith'], ['Linus', 'Torvalds'], ['Bart', 'Simpson']]
列表['Linus Torvalds','']中有一些这样的元素,我想删除它们。那么为什么下面的代码不能删除它们呢?
for i in people:
if(i[0] == '' or i[1] == ''):
print people.pop(people.index(i))
答案 0 :(得分:10)
您正在迭代它时更改列表,这是您的问题的根源。一种有效的方法是
people[:] = [p for p in people if p[0] != '' and p[1] != '']
这样就构建了一个只包含所需元素的新临时列表,然后在操作完成时将其分配给原始列表对象。
答案 1 :(得分:4)
如果您想“在适当的位置”调整列表大小,甚至可以people[:] = [p for p in people if all(p)]
。
答案 2 :(得分:3)
你在迭代它时修改列表的长度。这会导致您跳过值。当您从列表中弹出一个项目时,会发生以下情况(stealing from this answer):
[1, 2, 3, 4, 5, 6...]
^
这是最初列表的状态;现在说1被删除,循环进入列表中的第二项:
[2, 3, 4, 5, 6...]
^
等等。
答案 3 :(得分:1)
在迭代它时从列表中删除东西是个坏主意。所以,尝试其中一个(另外,我认为你的条件不是你想要的 - 我已经修好了):
L = [['John', 'Smith'], ['Linus', 'Torvalds'], ['Bart', 'Simpson']]
delete_these = []
for index, i in enumerate(L):
if not i[-1].strip():
delete_these.append(i)
for i in delete_these:
L.pop(i)
delete_these = map(lambda x: x-1, delete_these)
OR
L = [i for i in L if i[-1].strip()]
OR
answer = []
for i in L:
if i[-1].strip():
answer.append(i)
OR
i = 0
while i < len(L):
if not L[i][-1].strip():
L.pop(i)
else:
i += 1
希望这有帮助