Python removing items from list
我有一个给定格式的列表:
1
| [['John', 'Smith'], ['Linus', 'Torvalds'], ['Bart', 'Simpson']] |
在列表中有一些类似这样的元素['LinusTorvalds','',我想删除它们。那么为什么下面的代码不删除它们呢?
1 2 3
| for i in people:
if(i[0] == '' or i[1] == ''):
print people.pop(people.index(i)) |
号
- 我也尝试过人。移除(i)
- 您给出的列表没有任何情况,其中第一个或第二个元素是空字符串。
- 当你想处理索引的时候,使用像for i, (first, last) in enumerate(people):和i这样的值将是0,1,2,…
- 很可能只在某些时候使用迭代器(iter(people))和调用iterator.next()。但这很少是最好的解决方案。
您在对列表进行迭代时更改了它,这是问题的根源。有效的方法是
1
| people[:] = [p for p in people if p[0] != '' and p[1] != ''] |
这样,将生成一个只包含所需元素的新临时列表,并在操作完成后分配给原始列表对象。
- 如果你想得到相同的列表对象,你可以用people[:] = = ,如果您想"就地"调整列表的大小。
您正在修改列表的长度,同时对其进行迭代。这会导致您跳过值。当您从列表中弹出一个项目时,会发生以下情况(从这个答案中窃取):
1 2
| [1, 2, 3, 4, 5, 6...]
^ |
这是列表的初始状态;现在假设1被删除,循环转到列表中的第二项:
号
等等。
迭代列表时从列表中删除内容是一个坏主意。所以,试试这些方法中的一种(另外,我认为你的情况并不是你想要的——我已经解决了它):
1 2 3 4 5 6 7 8
| 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) |
。
或
1
| L = [i for i in L if i[-1].strip()] |
或
1 2 3 4
| answer = []
for i in L:
if i[-1].strip():
answer.append(i) |
。
或
1 2 3 4 5 6
| i = 0
while i < len(L):
if not L[i][-1].strip():
L.pop(i)
else:
i += 1 |
。
希望这有帮助