2010-06-09 9 views
5

supponiamo di avere un dizionario le cui chiavi sono stringhe. Come posso creare in modo efficiente un nuovo dizionario da quello che contiene solo le chiavi presenti in qualche elenco?Selezione degli elementi del dizionario per chiave in modo efficiente in Python

ad esempio:

# a dictionary mapping strings to stuff 
mydict = {'quux': ..., 
      'bar': ..., 
      'foo': ...} 

# list of keys to be selected from mydict 
keys_to_select = ['foo', 'bar', ...] 

Il modo in cui mi è venuto in mente è:

filtered_mydict = [mydict[k] for k in mydict.keys() \ 
        if k in keys_to_select] 

ma penso che questo è altamente inefficiente, perché: (1) che richiede l'enumerazione dei tasti con i tasti() (2) richiede ogni volta k in keys_to_select. almeno uno di questi può essere evitato, penserei. qualche idea? Posso usare anche scipy/numpy se necessario.

risposta

15
dict((k, mydict[k]) for k in keys_to_select) 

se si sa che tutti i tasti da selezionare sono anche chiavi in ​​mydict; se questo non è il caso,

dict((k, mydict[k]) for k in keys_to_select if k in mydict) 
+1

Quando si utilizza "se k in mydict" come questo, non Python esegue un tipo has_key ricerca, o lo fa trasformare le chiavi in ​​un elenco/iterabile e anello su di loro? Se è il secondo, "se mydict.has_key (k)" potrebbe essere più efficiente, no? (Non ho ancora trovato alcuna documentazione per chiarire, in entrambi i casi. Le competenze di Google mi hanno deluso). – pycruft

+1

Per rispondere alla mia domanda, usare "k in dict" è identico all'utilizzo di "dict.has_key (k)" secondo http://www.python.org/dev/peps/pep-0234/ – pycruft

+2

@pycruft, sì , e, come 'timeit' cqn confirm (' python -mtimeit -s'd = dict.fromkeys (range (99)) ''23 in d'' etc), 'in' è, infatti, circa il doppio della velocità come 'has_key' (salva ogni volta una ricerca attributo con nome, che è circa la stessa operazione di un dt loolup). Non c'è mai alcun motivo per usare 'has_key', ed è stato rimosso da Python 3. –

Problemi correlati