Python从列表中删除项目

时间:2011-07-06 15:05:06

标签: python nested-lists

我有一个给定格式的列表:

[['John', 'Smith'], ['Linus', 'Torvalds'], ['Bart', 'Simpson']]

列表['Linus Torvalds','']中有一些这样的元素,我想删除它们。那么为什么下面的代码不能删除它们呢?

for i in people:
    if(i[0] == '' or i[1] == ''):
        print people.pop(people.index(i))

4 个答案:

答案 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

希望这有帮助