繁体   English   中英

从列表中删除值的问题

[英]Issue in removing a value from the list

我从一个来源获得了一个值列表。 我还有一本标准值字典。 我需要删除列表中未在字典中找到的任何值。

我写这段代码只是为了测试它是如何工作的:

alist = [47, 64, 69, 37, 76, 83, 95, 97]
adict = {'A':47, 'B':69, 'C':76, 'D':97}

list2 = list(adict.values())

for i in alist:
    if i not in list2:
        alist.remove(i)

print(list2,alist)

output 是:

[47, 69, 76, 97] [47, 69, 76, 95, 97]

我在这里不明白的是为什么值 95 留在生成的新列表中

当我检查 list2 中是否存在 95 时,它显示正确的结果如下:

输入:

print(95 in list2)

OUTPUT:

False

如果我使用alist.remove(95)从列表中手动删除 95,它确实会被删除。

所以,任何人都可以帮助我了解我在这里出错的地方。 谢谢。

您正在删除您正在迭代的容器的项目,因此它是 escaping 项目。 这就是为什么 95 从未被访问过并保留在列表中的原因。

尝试在您自己的代码版本以下运行...您将了解“i”的值实际上是如何变化的。

alist = [47, 64, 69, 37, 76, 83, 95, 97]
adict = {'A':47, 'B':69, 'C':76, 'D':97}

list2 = list(adict.values())
print("list2: ", list2)
print("alist: ", alist)

print("\n\n for loop")
for i in alist:
    print("in loop: ")
    print("alist: ", alist)
    print("i: ", i)
    print("list2: ", list2)
    if i not in list2:
        print("removing ", i)
        alist.remove(i)
    print("\n")

print(list2,alist)

请参阅下文如何过滤列表。
您的代码中的方法的一般问题是您在迭代列表时操作列表。
不要那样做——结果出乎意料。

alist = [47, 64, 69, 37, 76, 83, 95, 97]
adict = {'A': 47, 'B': 69, 'C': 76, 'D': 97}
filtered = [x for x in alist if x in set(adict.values())]
print(filtered)

output(注意95不在新列表中)

[47, 69, 76, 97]

您正在修改迭代 object。当您迭代任何可迭代的 object 时,永远不要在迭代期间更改迭代 object

对于您的情况,您可以简单地使用& in set

alist = [47, 64, 69, 37, 76, 83, 95]
adict = {'A':47, 'B':69, 'C':76, 'D':97}

set1 = set(alist)
set2 = set(adict.values())

alist = list(set1 & set2)
print(alist)

output: [47, 69, 76] ,我故意删除了案例97

你的程序在逻辑上是正确的。 因为if仅在给定条件为True时执行。

现在,您的条件是: if i not in list2:那么程序将接受list2的项目以外的任何值。

print(95 not in list2)

会给你 True output 这就是if语句执行它的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM