2013-03-01 25 views
21

Ich habe ein Wörterbuch mit Zeichen-Integer-Schlüssel-Wert-Paar. Ich möchte alle diese Schlüssel-Wert-Paare entfernen, wo der Wert 0.Entfernen von Einträgen aus einem Wörterbuch basierend auf Werten

Zum Beispiel ist:

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

Ich möchte das gleiche Wörterbuch auf diese reduzieren:

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

Gibt es eine einfache Möglichkeit, das zu tun?

+0

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

Antwort

19

können Sie verwenden einen dict comprehension:

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

Oder in pre-2.7 Python, der dict Konstruktor in Kombination mit einem generator expression:

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

Beachten Sie, dass damit alle Werte entfernt werden, die zu "False" ausgewertet werden. Dies ist subtil anders, wenn Sie auch nicht ganzzahlige Werte haben. –

+0

@Lattyware: Es sieht für mich wie OP nur ganze Zahlen als Werte hat ... Ich kann nur mit dem arbeiten, was ich bekomme :) –

+0

mit '.items' anstelle von' .iteritems' kann sehr ineffizient für größere Datensätze sein. – Don

2

Ein Diktatverständnis?

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

In Python 2.6 und früher:

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} 

Für Pre-Python 2.7:

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

In beiden Fällen Sie Filterung der Tasten, deren Werte 0 aus und hand in das neue Wörterbuch zuweisen.

+0

IMO: besser als Niklas' Antwort aufgrund der Verwendung von 'iteritems' – Don

6

Wenn Sie nicht ein neues Wörterbuch erstellen möchten, können Sie diese verwenden:

>>> 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

Dies ist nicht in Python erlaubt 3:' Traceback (jüngste Aufforderung zuletzt): File "" Linie 1 in Runtime: Wörterbuch änderte Größe während der Iteration – bugmenot123

+5

@ bugmenot123 versuchen 'für Schlüssel in Liste (hand.keys()):' – Fabian

+0

Danke! Ich bin selbst mit dieser Lösung gelandet, habe aber vergessen, dass ich hier gepostet habe. :) – bugmenot123

Verwandte Themen