[英]Python wont remove items from list
filtered_list = ['PerezHilton', 'tomCruise', 'q', 'p']
#BIO[user]['follows'] is just a list of strings say ['a', 'b', 'katieh']
#specs is also a string say eg. 'katieh'
for user in filtered_list:
if specs not in BIO[user]['follows']:
filtered_list.remove(user)
上面针对某些共振的代码给出了此错误“ ValueError:list.remove(x):x不在列表中”,但显然“ p”在列表中,所以为什么它不检测“ p”却在查找“ q”? ?
我很沮丧,但是感谢您的任何帮助,谢谢
**抱歉,我现在已修复*
列表理解可以在一行中正确完成,位于文章的底部。 首先是对问题的一些了解。
不要做类似的事情:
for item in list_:
list_.remove(item)
因为坏事和令人困惑的事情发生了。
>>> list_ = range(10)
>>> for item in list_:
... list_.remove(item)
...
>>> list_
[1, 3, 5, 7, 9]
每次删除项目时,您都会更改其余项目的索引,这会弄乱循环。 在遍历列表时从列表中删除项目的一种好方法是按索引进行操作并向后工作,以使删除不会影响其余的迭代。 这样做会更好,因为如果删除第9个元素,那么第8个元素仍然是第8个元素,而第10个元素将成为第9个元素。 如果您已经处理过该元素,那么您不必关心它的索引是什么。
>>> list_ = range(10)
>>> for i in xrange(len(list_) - 1, -1, -1):
... del list_[i]
...
>>> list_
[]
或使用while
循环:
i = len(list_)
while i:
i -= 1
del list_[i]
因此,在您的情况下,代码看起来像
users[:] = [user for user in users if specs in BIO[user]['follows']]
因为这是一项筛选工作,而最好使用列表推导来完成。 [:]
的要点是,它分配给列表的一部分,而不是破坏对列表的引用。 这意味着对列表的所有其他引用都将被更新。 它本质上是原地的,除了副本覆盖原来的名单之前进行。 为了完整起见,下面是使用while
循环的方法。
i = len(users)
while i:
i -= 1
if specs not in BIO[users[i]]['follows']:
del users[i]
如果您希望它就位,则可以执行此操作。 此处没有列表的副本。
你为什么要迭代?
>>> un = ['PerezHilton', 'tomCruise', 'q', 'p']
>>> un.remove('p')
>>> un
['PerezHilton', 'tomCruise', 'q']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.