2016-02-07 22 views
21

Voglio verificare se tutti i valori, cioè i valori corrispondenti a tutti i tasti in un dizionario sono 0. C'è un modo per farlo senza loop? Se é cosi, come?Come verificare se tutti i valori di un dizionario sono 0, in Python?

+0

Come hai fatto con un ciclo continuo? –

+0

ho iterato attraverso il dizionario e ho controllato tutti i valori i valori corrispondenti a tutte le chiavi se anche uno non era vero ho cambiato il valore del flag e ho interrotto il ciclo. –

risposta

45

uso all():

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

all restituisce True se tutti gli elementi della data iterabile sono vere.

4

È possibile utilizzare il metodo any(), in pratica controlla i parametri booleani, ma in questo caso 0 fungerà da Falso e qualsiasi altro numero come Vero. Prova questo codice:

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

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

uscita:

False 
True 

Edit2: una nota a margine/cautela, di chiamare qualsiasi() con un elenco vuoto di elementi restituisce false.

+1

'all' è pigro pure. – timgeb

+0

@timgeb correct, grazie per il commento – Fanchi

+3

Ciò darà risultati errati per qualsiasi valore di falsi, [], Nessuno, {} ecc. –

7

Con 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 

Non importa se si utilizza any o all, la valutazione sarà pigro. all restituisce False sul primo valore di falsi che incontra. any restituisce True sul primo valore di verità che incontra.

Pertanto, not any(d.values()) fornirà lo stesso risultato per il dizionario di esempio fornito. È un po 'più corto della versione all con la comprensione del generatore. Personalmente, mi piace ancora la variante all perché esprime ciò che vuoi senza che il lettore debba fare la negazione logica nella sua testa.

C'è un problema più con l'utilizzo di any qui, però:

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

Il dizionario non contiene il valore 0, ma not any(d.values()) sarà tornare True perché tutti i valori sono falsy, cioè bool(value) rendimenti False per una lista vuota , dizionario o stringa.

In breve: conteggi di leggibilità, essere espliciti, utilizzare la soluzione all.

+0

Il 'not any' valuterà su True se tutti i valori sono _falsey_, quindi è diverso dal test se tutti i valori sono uguali a' 0'. –

2

Si può anche fare il contrario utilizzando qualsiasi:

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

Se restituisce True, tutti i tasti non sono 0, altrimenti tutti i tasti sono 0

Problemi correlati