2013-03-01 33 views
21

Mam słownik z parą klucz-wartość typu liczba całkowita. Chcę, aby usunąć wszystkie te pary wartość klucza, gdy wartość 0.Usuwanie wpisów ze słownika na podstawie wartości

Na przykład:

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

chcę zmniejszyć samego słownika to:

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

Czy istnieje prosty sposób to zrobić?

+0

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

Odpowiedz

19

Można użyć dict comprehension:

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

Lub, w pre-2.7 Python, konstruktor w połączeniu z generator expressiondict:

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

Zauważ, że to usuwa wszystkie wartości, które oceniają jako "Fałsz". Jest to nieco inne, jeśli masz również wartości niecałkowite. –

+0

@Lattyware: Wydaje mi się, że OP ma tylko liczby całkowite jako wartości ... Mogę pracować tylko z tym, co otrzymuję :) –

+0

użycie '.items' zamiast' .iteritems' może być bardzo nieefektywne w przypadku większych zestawów danych. – Don

2

Dyktowanie ze zrozumieniem?

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

W Pythonie 2.6 i wcześniejsze:

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} 

do wstępnego Pythonie 2.7:

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

W obu przypadkach masz filtrowanie klawiszy, których wartości są 0 i przypisywanie hand do nowego słownika.

+0

IMO: lepiej niż odpowiedzi Niklas' dzięki zastosowaniu 'iteritems' – Don

6

Jeśli nie chcesz, aby utworzyć nowy słownik, można użyć to:

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

To nie jest dozwolone w Pythonie 3:' Traceback (most recent call last): File "", wiersz 1, w RuntimeError: słownik zmieniono rozmiar podczas iteracji " – bugmenot123

+5

@ bugmenot123 spróbuj' dla listy na klawiaturze (hand.keys()): ' – Fabian

+0

Dziękujemy! Sama znalazłem to rozwiązanie, ale zapomniałem, że napisałem tutaj. :) – bugmenot123

Powiązane problemy