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')


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]

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.


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']

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]

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])

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']]

-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')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.