从集合中移除通过特定测试的项目 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
循环。
我需要删除 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
循环。