python-3.x 字典未从列表弹出?[重复]

kx7yvsdv  于 2022-12-05  发布在  Python
关注(0)|答案(2)|浏览(132)

此问题在此处已有答案

How to remove items from a list while iterating?(25个答案)
昨天关门了。
上下文无关紧要,但是我遇到了一个问题,当我试图从list中弹出dict对象时,它不能删除所有的对象。我这样做是为了过滤dict对象中的某些值,而我留下了一些应该被删除的内容。为了看看会发生什么,我尝试删除list中名为accepted_auctions的每个项目(如下所示),但没有成功。

for auction in accepted_auctions:
    accepted_auctions.pop(accepted_auctions.index(auction))

print(len(accepted_auctions))

当我测试这段代码时,print(len(accepted_auctions))44输出到控制台。
我做错了什么?

yvfmudvl

yvfmudvl1#

这看起来像是你在使用for循环遍历列表的同时调用了列表上的pop。这通常不是一个好主意,因为for循环使用一个迭代器遍历列表中的项目,而在遍历列表的同时修改列表可能会导致迭代器变得混乱,无法按预期的方式运行。
解决此问题的一种方法是创建一个仅包含要保留的项目的新列表,然后用新列表替换原始列表。下面是一个示例:

# Create an empty list to store the items that we want to keep
filtered_auctions = []

# Iterate over the items in the list
for auction in accepted_auctions:
    # Check if the item meets the criteria for being kept
    if some_condition(auction):
        # If it does, append it to the filtered list
        filtered_auctions.append(auction)

# Replace the original list with the filtered list
accepted_auctions = filtered_auctions

另一种解决方法是使用while循环而不是for循环。

# Keep looping until the list is empty
while accepted_auctions:
    # Pop the first item from the list
    auction = accepted_auctions.pop(0)

    # Check if the item meets the criteria for being kept
    if some_condition(auction):
        # If it does, append it to the filtered list
        filtered_auctions.append(auction)

# Replace the original list with the filtered list
accepted_auctions = filtered_auctions

我希望这对你有帮助!如果你有任何其他问题,请告诉我。

vc6uscn9

vc6uscn92#

在迭代列表时修改列表会使迭代器失效(因为在删除项时,所有项的索引都在改变),这反过来会导致它跳过项。
创建过滤列表的最简单方法是通过创建新列表的列表解析,例如:

accepted_auctions = [a for a in accepted_auctions if something(a)]

下面是一个简单的例子,使用列表解析将一个int列表过滤为奇数:

>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nums = [n for n in nums if n % 2]
>>> nums
[1, 3, 5, 7, 9]

相关问题