2016-12-11 74 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