Python-Wörterbuch erhalten mehrere Werte

74

Sry, wenn diese Frage bereits existiert, aber ich habe schon seit einiger Zeit gesucht.

Ich habe ein Wörterbuch in Python, und ich möchte einige Werte daraus als Liste abrufen, aber ich weiß nicht, ob dies von der Implementierung unterstützt wird.

myDictionary.get('firstKey')   # works fine

myDictionary.get('firstKey','secondKey')
# gives me a KeyError -> OK, get is not defined for multiple keys
myDictionary['firstKey','secondKey']   # doesn't work either

Aber kann ich das auf irgendeine Weise erreichen? In meinem Beispiel sieht es einfach aus, aber nehmen wir an, ich habe ein Wörterbuch mit 20 Einträgen und möchte 5 Schlüssel erhalten. Gibt es einen anderen Weg als zu tun

myDictionary.get('firstKey')
myDictionary.get('secondKey')
myDictionary.get('thirdKey')
myDictionary.get('fourthKey')
myDictionary.get('fifthKey')
PKlumpp
quelle
1
Super schwer zu suchende Frage. Ich bin froh, dass ich das endlich gefunden habe!
Stephen

Antworten:

53

Verwenden Sie eine forSchleife:

keys = ['firstKey', 'secondKey', 'thirdKey']
for key in keys:
    myDictionary.get(key)

oder ein Listenverständnis:

[myDictionary.get(key) for key in keys]
ComputerFellow
quelle
2
ok ich habe schon darüber nachgedacht, aber gibt es wirklich keinen implementierten weg? Ich meine, das ist nicht ganz seltsam, denke ich
PKlumpp
1
Wenn garantiert ist, dass jeder Schlüssel in den Schlüsseln im Wörterbuch enthalten ist, können Sie schreiben [myDictionary[key] for key in keys], aber es wird nicht viel einfacher.
Timgeb
4
oder [my_dict.get(x) for x in ['firstKey', 'secondKey', 'thirdKey']]für eine einzeilige Lösung, aber das ist so kompakt wie möglich.
Padraic Cunningham
1
ok das ist unglücklich aber vielen Dank für Ihre Mühe!
PKlumpp
Abhängig vom Anwendungsfall möchten Sie möglicherweise, dass eine ifAnweisung nach NoneWerten sucht, die von der getMethode zurückgegeben werden: [mydict.get(key) for key in keys if key in mydict]
Carolyn Conway
83

Hierfür gibt es bereits eine Funktion:

from operator import itemgetter

my_dict = {x: x**2 for x in range(10)}

itemgetter(1, 3, 2, 5)(my_dict)
#>>> (1, 9, 4, 25)

itemgettergibt ein Tupel zurück, wenn mehr als ein Argument übergeben wird. itemgetterVerwenden Sie zum Übergeben einer Liste an

itemgetter(*wanted_keys)(my_dict)

Beachten Sie, dass itemgetterdie Ausgabe nicht in ein Tupel eingeschlossen wird, wenn nur ein Schlüssel angefordert wird, und dass keine angeforderten Nullschlüssel unterstützt werden.

Veedrac
quelle
das ist cool. es ist nicht so kurz wie ich erwartet hatte, aber schön zu wissen;)
PKlumpp
2
Wie viel kürzer kannst du werden? Wenn der Name ist zu lang ... g = itemgetter. oO
Veedrac
Ich hatte erwartet, dass es eine eingebaute Syntax gibt, die ich nicht finden konnte. Natürlich können Sie es auf Ihre Weise kürzer machen, aber bei jeder Codeüberprüfung würde ich gefragt werden: wtf ist g (mykeys) (myDict): D
PKlumpp
2
Ein kleiner Haken dabei itemgettererfordert mindestens ein Argument. Wenn Sie also etwas Ähnliches tun möchten itemgetter(*some_keys)(some_dict), schlägt dies fehl, wenn some_keyses sich um eine leere Liste handelt.
Christian Reall-Fluharty
1
itemgetter wird sich nicht mit KeyError
NeilG
24

Niemand hat die mapFunktion erwähnt, die es einer Funktion ermöglicht, eine Liste elementweise zu bearbeiten:

mydictionary = {'a': 'apple', 'b': 'bear', 'c': 'castle'}
keys = ['b', 'c']

values = list( map(mydictionary.get, keys) )

# values = ['bear', 'castle']
Scottt
quelle
Eine Änderung, damit dies funktioniert, müssen Sie mapmit einer Liste versehen:values = list( map(mydictionary.get, keys) )
Kilozulu
Und das betrifft KeyError
NeilG
6

Sie können At von pydash verwenden :

from pydash import at
dict = {'a': 1, 'b': 2, 'c': 3}
list = at(dict, 'a', 'b')
list == [1, 2]
Bustawin
quelle
1
Ich würde empfehlen, dictim Beispiel einen besseren Namen für var zu wählen. Andernfalls wird der eingebaute dictTyp abgeschattet .
Ivan De Paz Centeno
3

Da ich hier keine ähnliche Antwort sehe, ist darauf hinzuweisen, dass Sie mit einem (Listen- / Generator-) Verständnis diese mehreren Werte entpacken und mehreren Variablen in einer einzigen Codezeile zuweisen können:

first_val, second_val = (myDict.get(key) for key in [first_key, second_key])
Epion
quelle
1

Wenn Sie pandasinstalliert haben, können Sie es in eine Reihe mit den Schlüsseln als Index verwandeln. Also so etwas wie

import pandas as pd

s = pd.Series(my_dict)

s[['key1', 'key3', 'key2']]
Mosqueteiro
quelle
-1

Wenn die Fallback-Tasten nicht zu viele sind, können Sie so etwas tun

value = my_dict.get('first_key') or my_dict.get('second_key')
Mux
quelle