Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从集合中删除通过特定测试的项_Python_Python 3.x_Set - Fatal编程技术网

Python 从集合中删除通过特定测试的项

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

我需要删除python集中某个dict键的
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)