Python 从集合中删除通过特定测试的项
我需要删除python集中某个dict键的Python 从集合中删除通过特定测试的项,python,python-3.x,set,Python,Python 3.x,Set,我需要删除python集中某个dict键的None值的所有项。给出一个简单的集合: In [7]: z Out[7]: {None, 1, 2} In [8]: for item in z: ...: if not item: ...: z.remove(item) ...: --------------------------------------------------------------------------- Runt
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
[7]:z中的
Out[7]:{None,1,2}
[8]中:对于z中的项目:
…:如果不是项目:
…:z.删除(项目)
...:
---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
在()
---->1对于z中的项目:
2如果不是项目:
3 z.移除(项目)
4.
RuntimeError:在迭代期间设置更改的大小
我不明白为什么,但它不允许我在迭代过程中删除对象。如何运行动态真理检查并从集合中删除项目?谢谢您请先复制一套:
for item in list(z):
if not item:
z.remove(item)
请先尝试制作该集的副本:
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)
当使用
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
循环。如果您想保留代码的结构,Rob有一个很好的答案;否则,您可以使用理解在一行中完成此操作
example_set = {None, 1, 2}
filtered_set = {item for item in example_set if item}
print(filtered_set) # {1, 2}
如果您的逻辑比只使用
If item
更复杂,那么最好保持for
循环。z={item for item in z If item not None}
@PeterWood,他的测试是真实性,而不是非非真实性。Try:z={item for item in z if item}
@Robᵩ 这将从集合中删除0
bool@PeterWood--完全正确,正如他目前的代码所希望的那样。当然,他的散文不是这样说的。我不再确定我们谁读对了他的问题。z={item for item in z if item not None}
@PeterWood,他的测试是真实性,而不是非非真实性。Try:z={item for item in z if item}
@Robᵩ 这将从集合中删除0
bool@PeterWood--完全正确,正如他目前的代码所希望的那样。当然,他的散文不是这样说的。我再也不确定我们谁读对了他的问题。虽然我同意这个方法,为什么不z.copy()
而不是list(z)
?虽然我同意这个方法,为什么不z.copy()
而不是list(z)
?