2013-03-01 22 views
21

Ho un dizionario con coppia di valori-chiave intero-carattere. Voglio rimuovere tutte quelle coppie di valori chiave in cui il valore è 0.Rimozione di voci da un dizionario basato sui valori

Ad esempio:

>>> hand 
{'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0} 

voglio per ridurre lo stesso dizionario a questo:

>>> hand 
{'m': 1, 'l': 1} 

v'è un facile modo di farlo?

+0

vedere this..http: //stackoverflow.com/questions/5447494/best-way-to-remove -an-item-from-a-python-dictionary –

risposta

19

È possibile utilizzare un dict comprehension:

>>> { k:v for k, v in hand.items() if v } 
{'m': 1, 'l': 1} 

Oppure, in pre-2.7 di Python, il dict costruttore in combinazione con un generator expression:

>>> dict((k, v) for k, v in hand.iteritems() if v) 
{'m': 1, 'l': 1} 
+2

Nota che ciò rimuove tutti i valori che valutano come 'False'. Questo è sottilmente differente se si hanno anche valori non interi. –

+0

@Lattyware: Mi sembra che OP abbia solo valori interi come valori ... Posso solo lavorare con quello che ottengo :) –

+0

utilizzando '.items' invece di' .iteritems' può essere molto inefficiente per i set di dati più grandi. – Don

2

Una comprensione del ditt?

{k: v for k, v in hand.items() if v != 0} 

in Python 2.6 e precedenti:

dict((k, v) for k, v in hand.items() if v != 0) 
9
hand = {k: v for k, v in hand.iteritems() if v != 0} 

per la pre-Python 2.7:

hand = dict((k, v) for k, v in hand.iteritems() if v != 0) 

In entrambi i casi il gioco è filtrare le chiavi i cui valori sono 0, e assegnando hand per il nuovo dizionario.

+0

IMO: meglio di risposta Niklas' a causa di uso di 'iteritems' – Don

6

Se non si desidera creare un nuovo dizionario, è possibile utilizzare questo:

>>> hand = {'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0} 
>>> for key in list(hand.keys()): ## creates a list of all keys 
...  if hand[key] == 0: 
...    del hand[key] 
... 
>>> hand 
{'m': 1, 'l': 1} 
>>> 
+2

Ciò non è consentito in Python 3:' Traceback (chiamata più recente scorso): file "", linea 1, in RuntimeError: dizionario dimensione modificata durante l'iterazione' – bugmenot123

+5

@ bugmenot123 prova 'per la chiave nell'elenco (hand.keys()):' – Fabian

+0

Grazie! Ho finito con quella soluzione me stesso ma avevo dimenticato di aver postato qui. :) – bugmenot123

Problemi correlati