Python无法从列表中删除项

0 投票
2 回答
1072 浏览
提问于 2025-04-16 07:45
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 not in list”,但很明显'p'在列表里,为什么它检测不到'p'却能找到'q'呢?

我真的很困惑,但任何帮助都很感激,谢谢。

** 对不起,我现在已经解决了这个问题 *

2 个回答

1

你为什么要进行循环操作呢?

>>> un = ['PerezHilton', 'tomCruise', 'q', 'p']
>>> un.remove('p')
>>> un
['PerezHilton', 'tomCruise', 'q']
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]

如果你想在原地完成这个操作,可以这样做。这里不会创建列表的副本。

撰写回答