Python从列表中删除项目[重复]
Posted
技术标签:
【中文标题】Python从列表中删除项目[重复]【英文标题】:Python removing items from list [duplicate] 【发布时间】:2011-09-29 17:29:40 【问题描述】:我有一个给定格式的列表:
[['John', 'Smith'], ['Linus', 'Torvalds'], ['Bart', 'Simpson']]
列表 ['Linus Torvalds', ''] 中有一些类似的元素,我想删除这些元素。那么为什么下面的代码不删除它们呢?
for i in people:
if(i[0] == '' or i[1] == ''):
print people.pop(people.index(i))
【问题讨论】:
我也试过 people.remove(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[:] = [p for p in ...
替换赋值,这样,列表理解的结果就会被塞回原始列表。
@TokenMacGuy:好点。更新了答案。
嗯。现在没有人可以看到旧方法,当您不需要保留列表对象标识时,您可以只用people = [p for p in ...
替换分配,这会更快一些,因为它避免了一些(但不是非常多)复制。
原始代码试图更改对象,使用pop
,可能是因为其他人可以访问它;因此,从语义的角度来看,当前版本是对原始问题的更好回答。
它可能更接近他的原始解决方案,但这并不意味着它是任何与问题相似的问题的最佳解决方案,即使对于这个特定的海报也是如此。一个成功的 pythonista 可以同时使用这两种技术。【参考方案2】:
如果您想“就地”调整列表大小,甚至可以使用people[:] = [p for p in people if all(p)]
。
【讨论】:
【参考方案3】:您在迭代列表时正在修改列表的长度。这会导致您跳过值。当您从列表中弹出一项时,会发生以下情况 (stealing from this answer):
[1, 2, 3, 4, 5, 6...]
^
这是列表最初的状态;现在说 1 被删除,循环转到列表中的第二项:
[2, 3, 4, 5, 6...]
^
等等。
【讨论】:
【参考方案4】:在迭代列表时从列表中删除内容是个坏主意。因此,请尝试其中一种(另外,我认为您的情况不是您想要的 - 我已经解决了):
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)
或
L = [i for i in L if i[-1].strip()]
或
answer = []
for i in L:
if i[-1].strip():
answer.append(i)
或
i = 0
while i < len(L):
if not L[i][-1].strip():
L.pop(i)
else:
i += 1
希望对你有帮助
【讨论】:
以上是关于Python从列表中删除项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章