2016-12-11 76 views
2

我有一个集合列表。我想为这些集合中的每一个添加一个元素,并且我想用列表理解来做到这一点。这是我曾尝试:添加元素以Python中列表理解的形式设置

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,而不是一个元素添加到列表中,我怎样才能使这项工作?

+1

'set.add'工作正常,不会返回任何东西(因此您的'None's)。如果你想要你想要的输出,然后运行列表理解但不保存结果。在列表理解后检查你的'set1'和'set2'以获得所需的输出。 – MSeifert

回答

5

我建议:

[e | {0} for e in sets1] 

或:

[e.union({0}) for e in sets1] 
0

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

for subset in sets1: 
    subset.add(0) 

print(sets1) 

应该给你想要的输出。

我已经指出了这一点在comments为什么你的做法看似没有工作:

set.add工作到位,不返回任何东西(所以你None S)。如果你想要你想要的输出,然后运行列表理解但不保存结果。在列表理解后检查你的set1和set2以获得所需的输出。

所以你可以在列表理解后检查sets1sets2。它应该返回:[{0}][{1,2,0}, {1,2,3,0}](订单可能会因集合无序而有所不同)。

1

让我们先重新生成你的问题。

>>> test_set = set() 
>>> test_set 
set() 
>>> print(test_set.add(0)) 
None 
>>> test_set 
{0} 
>>> 

正如你所看到的,test_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}] 

然而,这不是就地操作。 sets2在运行上述列表理解之前和之后将完全相同。

+0

Downvoter,关心评论? –

+0

当人们没有任何合乎逻辑的理由而倒退时,这是非常令人沮丧的。 –

1

实际上,您的sets1sets2变量已成为您想要的结果,因为add语句操作sets1但未生成新列表。
您可以print(sets1)print(sets2)作证。

+0

只是一个小点:它确实创建了一个新列表,它不会生成新的集合。除此之外,我在这个问题的评论和我的回答中已经提到过。 – MSeifert