2013-07-11 16 views
5

Ho bisogno di estrarre quelle chiavi di un dizionario i cui valori superano una certa condizione. Fondamentalmente, io voglio fare questo, solo in un più modo pythony più breve:Python3: estrazione condizionale di chiavi da un dizionario con comprensione

keys=[] 
for key in dict: 
    if dict[key]==True: 
     keys.append(key) 

Questa era la mia idea originale, ma solleva un ValueError:

[key for (key,val) in map if val==True] 

sono arrivato fino a questo per il momento, ma non posso evitare di pensare che non è molto bello:

[key for key in map.keys() if map[key]==True] 

c'è un modo meno disordinato ad esso? Forse qualcosa di ovvio che mi manca chiaramente?

Grazie!

risposta

0

L'iterazione su una mappatura produce solo chiavi. Utilizzare invece map.items().

+1

La domanda è etichettato (nel titolo) Python 3, quindi 'dict.iteritems()' non esiste. – Volatility

+0

@Volatility: Questo mi impara solo guardando i tag ... –

2

Usa dict.items()

[key for key, val in dct.items() if val] 

Se si vuole prendere solo i tasti con True valori, piuttosto che qualsiasi valore true-ish, è possibile utilizzare un controllo di uguaglianza:

[key for key, val in dct.items() if val==True] 

Si fa notare in PEP8, tuttavia, questo non dovrebbe confrontare i valori booleani usando == - quindi non usarlo a meno che non sia assolutamente necessario.

Inoltre, si prega di non nominare le variabili dict o map (anche se è solo a scopo dimostrativo) perché ombreggiano i bulitini.

3

Ecco un modo per ottenere le chiavi con valori veri che è molto più breve e più pulito di una comprensione (non che comprensioni sono male però):

>>> dct = {0:False, 1:True, 2:False, 3:True} 
>>> list(filter(dct.get, dct)) 
[1, 3] 
>>> 
+0

Non hai bisogno di 'dct.keys()' - iterando su un dizionario restituisce già le chiavi. Usa 'dct' – Volatility

Problemi correlati