2016-02-07 10 views
21

Chcę sprawdzić, czy wszystkie wartości, tj. Wartości odpowiadające wszystkim kluczom w słowniku, są równe 0. Czy jest jakiś sposób, aby zrobić to bez pętli? Jeśli tak to jak?Jak sprawdzić, czy wszystkie wartości słownika są równe 0 w Pythonie?

+0

Jak to zrobiłeś z pętla? –

+0

Przeszedłem przez słownik i sprawdziłem wszystkie wartości, tj. Wartości odpowiadające wszystkim klawiszom, nawet jeśli nie był on prawdziwy, zmieniłem wartość flagi i wyskoczyłem z pętli. –

Odpowiedz

45

użycie all():

all(value == 0 for value in your_dict.values()) 

all powraca True jeśli wszystkie elementy danego iterowalny są prawdziwe.

4

Możesz użyć metody any(), w zasadzie sprawdza ona boolowskie parametry, ale 0 będzie działać jako Fałsz w tym przypadku, a każda inna liczba jako Prawda. Spróbuj kod:

dict1 = {"a": 0, "b": 1} 
dict2 = {"a": 0, "b": 0} 

print not any(dict1.itervalues()) 
print not any(dict2.itervalues()) 

wyjściowa:

False 
True 

Edit2: jeden sidenote/ostrożność, nazywając każdy() z pustą listą elementów zwróci false.

+1

'all' również jest leniwy. – timgeb

+0

@timgeb poprawne, dziękuję za komentarz – Fanchi

+3

Da to niepoprawne wyniki dla każdej wartości falsey, [], Brak, {} itd .. –

7

Z all:

>>> d = {1:0, 2:0, 3:1} 
>>> all(x==0 for x in d.values()) 
False 
>>> d[3] = 0 
>>> all(x==0 for x in d.values()) 
True 

Bez względu na to, czy używasz any lub all, ocena będzie leniwy. all zwraca False z pierwszej napotkanej wartości falsyfikatu. any zwraca True o pierwszej prawdziwej wartości, jaką napotyka.

W ten sposób not any(d.values()) da taki sam wynik dla przykładowego słownika, który podałem. Jest nieco krótszy niż wersja all ze zrozumieniem generatora. Osobiście nadal lubię wariant all lepiej, ponieważ wyraża to, czego chcesz, bez konieczności czytania logicznej negacji w głowie.

Jest jeszcze jeden problem z użyciem any tutaj, choć:

>>> d = {1:[], 2:{}, 3:''} 
>>> not any(d.values()) 
True 

Słownik nie zawiera wartość 0, ale not any(d.values()) powróci True ponieważ wszystkie wartości są falsy, tj bool(value) Przywraca False dla pustej listy , słownik lub ciąg znaków.

Podsumowując: czytelność się liczy, bądź jednoznaczny, użyj rozwiązania all.

+0

Parametr 'not any' ma wartość True, jeśli wszystkie wartości to _falsey_, więc różni się od sprawdzania, czy wszystkie wartości są równe' 0'. –

2

Można również zrobić to w inny sposób, za pomocą dowolnego:

>>> any(x != 0 for x in somedict.values()) 

Jeśli zwraca True, wszystkie klawisze są nie 0, w przeciwnym wypadku wszystkie przyciski są 0

Powiązane problemy