在Python中以列表理解的形式添加要设置的元素

在Python中以列表理解的形式添加要设置的元素,python,set,list-comprehension,Python,Set,List Comprehension,我有一张布景单。我想在这些集合中的每一个集合中添加一个元素,我想通过列表理解来实现这一点。这就是我尝试过的: In [1]: sets1 = [set()] In [2]: sets2 = [{1,2}, {1,2,3}] In [3]: [e.add(0) for e in sets1] Out[3]: [None] In [4]: [e.add(0) for e in sets2] Out[4]: [None, None] 我期望的输出是: [{0}] [{1,2,0}, {1,2,

我有一张布景单。我想在这些集合中的每一个集合中添加一个元素,我想通过列表理解来实现这一点。这就是我尝试过的:

In [1]: sets1 = [set()]

In [2]: sets2 = [{1,2}, {1,2,3}]

In [3]: [e.add(0) for e in sets1]
Out[3]: [None]

In [4]: [e.add(0) for e in sets2]
Out[4]: [None, None]
我期望的输出是:

[{0}]
[{1,2,0}, {1,2,3,0}]
为什么上面的代码返回
None
,而不是向列表中添加元素,以及我如何才能做到这一点?

我建议:

[e | {0} for e in sets1]
或:


在这种情况下,我不会使用列表理解,简单的
for
循环会更简单:

for subset in sets1:
    subset.add(0)

print(sets1)
应该给你想要的输出

我已经在《为什么你的方法似乎不起作用》一书中指出了这一点:


set.add
在适当的位置工作,不返回任何内容(因此您的
None
s)。如果需要所需的输出,请运行列表,但不要保存其结果。在列表理解后检查set1和set2以获得所需的输出


因此,在理解列表后,您可以只检查
sets1
sets2
。它应该返回:
[{0}]
[{1,2,0},{1,2,3,0}]
(顺序可能会有所不同,因为集合是无序的)。

让我们首先重新生成您的问题

>>> test_set = set()
>>> test_set
set()
>>> print(test_set.add(0))
None
>>> test_set
{0}
>>> 
如您所见,
test\u set.add(0)
返回
None
。但这是一个就地操作,因此确实添加了该项。从上面的代码片段可以看出这一点


如何解决问题:

将元素设置为集合后,您可以使用
union
,而不是使用
add
方法

>>> [i.union({0}) for i in sets2]
[{0, 1, 2}, {0, 1, 2, 3}]
如果要将元素列表/集合添加到现有集合列表中,则可以执行以下操作:

elements_to_add = [3,4,5]
>>> [i.union(set(elements_to_add)) for i in sets2]
[{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}]

但是,这不是一个就地操作<代码>设置2在运行上述列表之前和之后将完全相同

实际上,您的
sets1
sets2
变量已成为您想要的结果,因为
add
语句操作
sets1
,但不生成新列表。

您可以
print(sets1)
print(sets2)
作证。

set。add
工作到位,不返回任何内容(因此您的
None
s)。如果需要所需的输出,请运行列表,但不要保存其结果。在列表理解之后,检查
set1
set2
,以获得所需的输出。只是一个小问题:它确实创建了一个新列表,但它只是不生成新的集合。除此之外,我已经在对问题的评论和我的回答中提到了这一点。当人们没有任何逻辑上的理由就否决投票时,这是非常令人沮丧的。
elements_to_add = [3,4,5]
>>> [i.union(set(elements_to_add)) for i in sets2]
[{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}]