从集合中移除通过特定测试的项目 python

remove items from set that pass a certain test python

我需要删除 python 集中某个字典键具有 None 值的任何项目。给定一个简单的集合:

In [7]: z
Out[7]: {None, 1, 2}

In [8]: for item in z:
   ...:     if not item:
   ...:         z.remove(item)
   ...:         
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-680a51a37622> in <module>()
----> 1 for item in z:
      2     if not item:
      3         z.remove(item)
      4 

RuntimeError: Set changed size during iteration

我不明白为什么,但它不允许我在迭代期间删除对象。我如何 运行 进行动态真值检查并从集合中删除项目?谢谢

首先尝试复制该集合:

for item in list(z):
    if not item:
        z.remove(item)

当使用 for 循环遍历列表或字典时,此错误非常常见。问题是您打算在执行此操作时更改词典的内容。

在这种情况下,一种解决方案是使用索引遍历字典,例如:

for i in range( len(dic) ):

但是您正在使用 SET,python 3 中的 SET 对象有一个名为 discard 的方法,您可以使用它来执行您想要的操作。例如:

z = {None, 1, 2}
z.discard(None)
print(z)

如果您想保留代码的结构,Rob 有一个很好的答案;否则,您可以使用理解在一行中完成此操作。

example_set = {None, 1, 2}
filtered_set = {item for item in example_set if item}

print(filtered_set) # {1, 2}

如果您的逻辑比 if item 更复杂,那么最好保留 for 循环。