2014-04-05 18 views
11

Penso che questo possa essere collegato al set mutable.Come rimuovere un elemento da un set?

Fondamentalmente, posso rimuovere un elemento da un set utilizzando set.discard(element). Tuttavia, set.discard(element) restituisce None. Ma mi piacerebbe avere una copia del set aggiornato. Ad esempio, se ho una lista di set, come posso ottenere una copia aggiornata usando le operazioni di comprensione delle liste?

codice

Esempio:

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

tornerà

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

SOF è un posto così incredibile! Le risposte a @thefourtheye e @roippi funzionano bene! La risposta @roippi ha un vantaggio in termini di velocità e può avere anche un'applicazione più ampia. Ho accettato @thefourtheye risposta solo perché funziona comodamente nel mio caso, in cui l'elenco dei set viene generato da un elenco di liste. Quindi posso codificare semplicemente '[set (x) - {''} per x nella lista]'. Ma molte grazie a tutti e due! –

+0

Nel caso in cui la comprensione dell'elenco si traduca in un elenco indipendente di set, senza alcuna modifica ai set originali, o dovrebbe modificare l'originale? Se si desidera modificare l'originale, è meglio non usare affatto la comprensione di una lista; un ciclo 'for' è più adatto. – user2357112

+0

@ user2357112 Mi piacerebbe modificare l'originale (non importa in realtà ma dal momento che il set di dati è grande, non voglio creare copie). Qual è la ragione per cui "for loop" è meglio della comprensione delle liste in questo caso? –

risposta

7

È possibile utilizzare set difference operator, come questo

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

Questo potrebbe risolvere il vero problema dell'OP, ma è semanticamente diverso da quello che ha chiesto nella sua domanda poiché non modifica i set originali. –

+0

Sono d'accordo con @AdrianRatnapala e penso che roippi abbia la risposta corretta. –

9

Ogni volta che si sente vincolati da un metodo che funziona solo sul posto , puoi usare il comportamento di or/and in achie ve la semantica che vuoi

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

questa tecnica è a volte utile per raggiungere le cose in un lambda (o di altre situazioni in cui si sono limitati a una singola espressione) che sono altrimenti impossibili. Che si tratti di più "leggibile" o "divinatorio" è :-) discutibile

+3

Fare attenzione a non mettere 'x' sul lato sinistro in questo caso o l'espressione' or' causerà un cortocircuito e la mutazione non si verificherà mai. '[x o x.discard ('') per x in test] == ​​[{'', 'a'}, {'', 'b'}]' –

0

questo? (Duplicato di @thefourtheye risposta)

set operazione di sottrazione restituisce i dati set.

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

uscita:

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