2015-06-11 17 views
5

Un utente ha chiesto (Keyerror while using pandas in PYTHON 2.7) perché aveva uno KeyError mentre cercava un dizionario e come poteva evitare questa eccezione.Sto usando `all` correttamente?

Come risposta, gli ho suggerito di verificare prima le chiavi nel dizionario. Quindi, se aveva bisogno di tutte le chiavi ['key_a', 'key_b', 'key_c'] nel dictionary, avrebbe potuto testarlo con:

if not all([x in dictionary for x in ['key_a', 'key_b', 'key_c']]): 
    continue 

In questo modo ha potuto ignorare dizionari che non avevano le chiavi attesi (l'elenco dei dizionari è creato dal JSON linee formattate caricate da un file). * Fare riferimento alla domanda originale per ulteriori dettagli, se pertinente a questa domanda.

Un utente più esperto in Python e SO, che vorrei prendere in considerazione un'autorità in materia per i suoi carriera e oro distintivi mi ha detto che stavo usando all in modo non corretto. Mi stavo chiedendo se questo è davvero il caso (per quello che posso dire, che funziona come previsto) e perché, o se c'è un modo migliore per verificare se un paio di chiavi sono tutte in un dizionario.

+1

Proprio come una parte alla tua domanda qui, ma se sei preoccupato se una chiave è in un dizionario prima di provare a ottenere il suo valore puoi sempre chiamare il metodo 'get()' sul ditt. Quindi 'dict.get ('key', None)' restituirà il valore di 'key' o' None', dove 'dict [' key '] 'potrebbe generare un KeyError. – Jkdc

risposta

13

Sì che funzionerà bene, ma non è nemmeno necessario l'elenco di comprensione

if not all(x in dictionary for x in ['key_a', 'key_b', 'key_c']): 
    continue 

Se avete la [] circostante, valuterà tutti gli elementi prima di chiamare all. Se li rimuovi, l'espressione interna è un generatore e sarà short-circuit sul primo False.

+0

@MartijnPieters come sempre, hai ragione, signore. –

+3

'should_we = lambda: False # ad es. NO' e 'destroy_world = lambda:" Richiama Cthulhu, mangiatore di mondi "', quindi 'se tutto (f() per f in (dovrebbe_we, destroy_world)): print (" siamo ancora qui? ")' Non lo farà distruggi il mondo. –

+0

@MartijnPieters Il problema è che Cthulhu può viaggiare nel tempo, così come nell'ordine di espressione del generatore, quindi può essere chiamato prima, sfortunatamente: P – CoryKramer

Problemi correlati