Python不会从列表中删除项目

时间:2010-11-29 07:20:44

标签: 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)

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

我很难过,但感谢任何帮助,谢谢

**抱歉我现在修复 *

2 个答案:

答案 0 :(得分:7)

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

不要做以下事情:

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]

如果您希望这样做,您可以这样做。这里没有列表的副本。

答案 1 :(得分:1)

你为什么要迭代?

>>> un = ['PerezHilton', 'tomCruise', 'q', 'p']
>>> un.remove('p')
>>> un
['PerezHilton', 'tomCruise', 'q']