在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}]