2010-06-09 11 views
5

Angenommen, ich habe ein Wörterbuch, dessen Schlüssel Strings sind. Wie kann ich aus einem Wörterbuch, das nur die in einer Liste vorhandenen Schlüssel enthält, effizient ein neues Wörterbuch erstellen?Dictionary-Einträge effizient nach Schlüssel in Python

zum Beispiel:

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

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

Die Art und Weise kam ich mit ist:

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

aber ich denke, das ist sehr ineffizient ist, weil: (1) es erfordert, dass die Tasten mit den Tasten Aufzählen() (2) es erfordert jedes Mal, k in keys_to_select nachzuschlagen. Mindestens eine davon kann vermieden werden, würde ich denken. irgendwelche Ideen? Ich kann scipy/numpy auch benutzen, wenn es gebraucht wird.

Antwort

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

wenn Sie wissen, alle Schlüssel zu wählen sind auch Schlüssel in mydict; wenn das nicht der Fall ist,

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

Wenn „wenn k in myDict“ wie diese verwenden, wird Python eine has_key Typ-Lookup ausführen, oder hat sie die Schlüssel in eine Liste/iterable und Schleife über sie konvertieren? Wenn es das letztere ist, "wenn mydict.has_key (k)" könnte effizienter sein, nein? (Ich habe noch keine Dokumentation gefunden, um sie zu klären. Die Google-Fähigkeiten haben mich enttäuscht). – pycruft

+1

Um meine eigene Frage zu beantworten, ist die Verwendung von "k in dict" identisch mit der Verwendung von "dict.has_key (k)" gemäß http://www.python.org/dev/peps/pep-0234/ – pycruft

+2

@pycruft, yep , und, wie 'timeit' cqn bestätigen (' python -mtimeit -s'd = dict.fromkeys (Bereich (99)) '' 23 in d''etc), ist' in' tatsächlich ungefähr doppelt so schnell als 'has_key' (speichert jedes Mal ein named-attribute lookup, was ungefähr der gleiche Vorgang ist wie ein dict loolup). Es gibt keinen Grund mehr, 'has_key' zu verwenden und es wurde aus Python 3 entfernt. –

Verwandte Themen