[英]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.