函数中的 For 循环未迭代整个列表/快速停止迭代

问题描述 投票:0回答:1

我有以下代码:

oldlist = [42, 72, 32, 4, 94, 82, 67, 67, 89, 89, 89, 89, 5, 90, 5, 5]

def removeodds(thing):
    for i in reversed(thing):
        icount = thing.count(i)
        if icount % 2 > 0:
            while i in thing:
                thing.remove(i)
    return thing

newlist = removeodds(oldlist)
print(newlist)

这就是整个节目。

该函数应该遍历列表并查找列表中重复奇数次的任何数字。然后在 while 循环中删除它们。

它通过使用 i 启动 for 循环来实现这一点。

然后使用 count() 函数查看元素 i 在列表中出现的次数 (icount)。 如果 icount 除以二有余数,则它是奇数。然后 while 循环遍历列表,直到 i 被删除。

我有反向迭代列表,因为如果它以相反的方式迭代,元素在被删除时会在列表中移动,并且 for 循环最终会跳过索引。

但是,在上面的程序中,当你运行它时,for循环在90处停止,然后将列表发送回来,显示以下结果:

[42, 72, 32, 4, 94, 82, 67, 67, 89, 89, 89, 89, 90] 

我不明白它为什么这样做。它应该显示以下内容:

  [67, 67, 89, 89, 89, 89] 

我尝试将数字添加到列表中并更改周围的内容。 如果在 5 到 90 之间再添加 5 个,该程序就可以运行。 然而,当前列表总是在 90 处停止 for 循环。 一旦运行,该函数应该返回一个列表,其中仅包含在列表中出现偶数次的数字。

python list for-loop while-loop
1个回答
0
投票

枚举列表时不要修改列表。

您可以像这样更简单地实现您的目标:

from collections import Counter

oldlist = [42, 72, 32, 4, 94, 82, 67, 67, 89, 89, 89, 89, 5, 90, 5, 5]

c = Counter(oldlist)

newlist = [n for n in set(oldlist) if c[n] % 2 == 0]

输出:

[67, 89]


print(newlist)
© www.soinside.com 2019 - 2024. All rights reserved.