2014-04-05 10 views
11

Myślę, że może to być związane z zestawem będącym mutable.Jak usunąć element z zestawu?

Zasadniczo mogę usunąć element z zestawu przy użyciu set.discard(element). Jednak samo set.discard(element) zwraca None. Ale chciałbym dostać kopię zaktualizowanego zestawu. Na przykład, jeśli mam listę zestawów, w jaki sposób można wygodnie pobrać zaktualizowaną kopię za pomocą operacji listowania?

kod

Próbka:

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

powróci

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

SOF jest takie niesamowite miejsce! Obie odpowiedzi @thefourtheye i @roippi działają ładnie! Odpowiedź @roippi ma przewagę prędkości i może mieć szersze zastosowanie. Zaakceptowałem odpowiedź @freaks tylko dlatego, że działa ona wygodnie w moim przypadku, gdy lista zestawów jest generowana z listy list. Mogę więc kodować po prostu '[set (x) - {''} dla x na liście]'. Ale wielkie dzięki dla was obojga! –

+0

Czy zrozumienie listy powinno prowadzić do niezależnej listy zestawów, bez modyfikacji oryginalnych zestawów, czy też powinno zmodyfikować oryginał? Jeśli chcesz zmodyfikować oryginał, najlepiej nie używać ze zrozumieniem listy; pętla 'for' jest bardziej odpowiednia. – user2357112

+0

@ user2357112 Chciałbym zmodyfikować oryginał (nie ma to znaczenia, ale ponieważ zbiór danych jest duży, nie chcę tworzyć kopii). Jaki jest powód, dla którego "pętla" jest w tym przypadku lepsza niż rozumienie list? –

Odpowiedz

7

Można użyć set difference operator, jak to

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

To może rozwiązać prawdziwy problem PO, ale różni się on od tego, o co prosił w swoim pytaniu, ponieważ nie modyfikuje oryginalnych zestawów. –

+0

Zgadzam się z @AdrianRatnapala i myślę, że roippi ma poprawną odpowiedź. –

9

gdy czujesz ograniczane przez sposób, który działa tylko w miejscu , możesz użyć zachowania or/and do wykonania ve semantykę, którą chcesz.

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

Technika ta jest czasami przydatne do osiągnięcia rzeczy w lambda (lub innych sytuacjach, gdy jesteś ograniczony do jednego wyrazu), które w przeciwnym razie niemożliwe. Czy jest to najbardziej „czytelny” lub „pythonic” jest dyskusyjna :-)

+3

Należy uważać, aby w tym przypadku nie wstawić 'x' po lewej stronie, albo wyrażenie" lub "spowoduje zwarcie i mutacja nigdy nie wystąpi. '[x lub x.discard ('') dla x w teście] == [{'', 'a'}, {'', 'b'}]' –

0

to? (Duplikat @thefourtheye odpowiedzi)

set operacja odejmowania zwraca set danych.

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

wyjściowa:

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