Python不会从列表中删除项目

133*_*day 0 python 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)
Run Code Online (Sandbox Code Playgroud)

一些共振的上述代码给出了这个错误"ValueError:list.remove(x):x不在列表中",但显然'p'在列表中,所以为什么它没有检测到'p'但却发现'q'? ?

我很难过,但任何帮助都表示赞赏,谢谢

**抱歉我现在搞定了*

aar*_*ing 7

在一行中正确执行此操作的列表理解位于帖子的底部.以下是对问题的一些了解.

不要做以下事情:

for item in list_:
    list_.remove(item)
Run Code Online (Sandbox Code Playgroud)

因为糟糕而混乱的事情发生了.

>>> list_ = range(10)
>>> for item in list_:
...     list_.remove(item)
... 
>>> list_
[1, 3, 5, 7, 9]
Run Code Online (Sandbox Code Playgroud)

每次删除一个项目时,都会更改其他项目的索引,这会影响循环.在遍历列表时从列表中删除项目的一种好方法是通过索引和向后工作来执行此操作,以便删除不会影响其余的迭代.这是更好的,因为如果你删除第9个元素,那么第8个元素仍然是第8个元素,但第10个元素成为第9个元素.如果你已经处理过那个元素,那么你不关心它的索引是什么.

>>> list_ = range(10)
>>> for i in xrange(len(list_) - 1, -1, -1):
...     del list_[i]
... 
>>> list_
[]
Run Code Online (Sandbox Code Playgroud)

或者while循环:

i = len(list_)
while i:
    i -= 1
    del list_[i]
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,代码看起来像

users[:] = [user for user in users if specs in BIO[user]['follows']]
Run Code Online (Sandbox Code Playgroud)

因为这是一个过滤工作,最好用列表推导完成.关键[:]是它分配给列表的一部分而不是破坏对列表的引用.这意味着将更新列表的每个其他引用.它本质上是原地的,除了副本覆盖原来的名单之前进行.为了完整起见,这里是如何使用while循环来完成它.

i = len(users)
while i:
    i -= 1
    if specs not in BIO[users[i]]['follows']:
        del users[i]
Run Code Online (Sandbox Code Playgroud)

如果您希望它完成,您可以这样做.这里没有列表的副本.