2014-04-05 146 views
11

我認爲這可能與設置爲mutable有關。如何從集合中刪除元素?

基本上,我可以使用set.discard(element)從一組中刪除一個元素。但是,set.discard(element)本身返回None。但我想獲得更新集的副本。例如,如果我有一組列表,如何使用列表理解操作方便地獲取更新副本?

示例代碼:

test = [{'', 'a'}, {'b', ''}] 
print [x.discard('') for x in test] 
print test 

將返回

[None, None] 
[set(['a']), set(['b'])] 
+0

SOF就是這樣一個神奇的地方! @thefourtheye和@roippi的答案都很好! @roippi答案具有速度優勢,可能也有更廣泛的應用。我接受@thefourtheye答案只是因爲它適用於我的情況,其中列表是從列表中生成的。所以我可以簡單編寫'[set(x) - {''} for x in list]'。但非常感謝你們兩位! –

+0

列表理解是否應該產生獨立的集合列表,而不需要修改原始集合,還是應該修改原始集合?如果你想修改原文,最好不要使用列表理解; 'for'循環更適合。 – user2357112

+0

@ user2357112我想修改原文(它並不重要,但由於數據集很大,我不想創建副本)。在這種情況下,for循環比列表理解更好的原因是什麼? –

回答

7

您可以使用set difference operator,這樣

test, empty = [{'', 'a'}, {'b', ''}], {''} 
print [x - empty for x in test] 
# [set(['a']), set(['b'])] 
+1

這可能很好地解決了OP的實際問題,但它在語義上不同於他在他的問題中所要求的,因爲它不修改原始集合。 –

+0

我同意@AdrianRatnapala,我認爲roippi有正確的答案。 –

9

每當你這是隻能在原地的方法感到約束,您可以使用or/and的行爲來實現有你想要的語義。

[x.discard('') or x for x in test] 

該技術對於在那些否則不可能一個lambda(或其他情況下,您被限制爲單一表達)實現的事情偶爾是有用的。無論是最「可讀」或「Python化」是值得商榷的:-)

+3

在這種情況下,請注意不要在左側放置'x',否則'或'表達式將會短路並且突變永遠不會發生。 '[x或x.discard('')for x in test] == [{'','a'},{'','b'}]'' –

0

這?(答案@thefourtheye重複)

set減法操作返回set數據。

test = [{'', 'a'}, {'b', ''}] 
print [x - {''} for x in test] 
print test 

輸出:

[set(['a']), set(['b'])] 
[set(['a', '']), set(['', 'b'])]