157 Stimmen

Wie man mehrere Wörterbuchwerte erhält?

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

myDictionary.get('ersterSchlüssel')   # funktioniert gut

myDictionary.get('ersterSchlüssel','zweiterSchlüssel')
# wirft KeyError -> OK, get ist nicht für mehrere Schlüssel definiert
myDictionary['ersterSchlüssel','zweiterSchlüssel']   # funktioniert auch nicht

Gibt es einen Weg, dies zu erreichen? In meinem Beispiel sieht es einfach aus, aber sagen wir, ich habe ein Wörterbuch mit 20 Einträgen und ich möchte 5 Schlüssel abrufen. Gibt es einen anderen Weg, als das Folgende zu tun?

myDictionary.get('ersterSchlüssel')
myDictionary.get('zweiterSchlüssel')
myDictionary.get('dritterSchlüssel')
myDictionary.get('vierterSchlüssel')
myDictionary.get('fünfterSchlüssel')

8voto

Andy Brown Punkte 10191

Ich denke, dass Listenverständnis eine der saubersten Möglichkeiten ist, die keine zusätzlichen Imports benötigt:

>>> d={"foo": 1, "bar": 2, "baz": 3}
>>> a = [d.get(k) for k in ["foo", "bar", "baz"]]
>>> a
[1, 2, 3]

Oder wenn Sie die Werte als separate Variablen möchten, dann verwenden Sie Mehrfachzuweisung:

>>> a,b,c = [d.get(k) for k in ["foo", "bar", "baz"]]
>>> a,b,c
(1, 2, 3)

7voto

Mainland Punkte 3417

%timeit Antwort auf alle oben aufgeführten Antworten. Entschuldigung, wenn ich einige der Lösungen übersehen habe, und ich habe mein Urteilsvermögen eingesetzt, um ähnliche Antworten zu gruppieren. itemgetter scheint für mich der Gewinner zu sein. pydash meldet viel kürzere Zeit, aber ich weiß nicht, warum es weniger Schleifen ausgeführt hat und ob ich es am schnellsten nennen kann. Deine Gedanken?

from operator import itemgetter

my_dict = {x: x**2 for x in range(10)}
req_keys = [1, 3, 2, 5]
%timeit itemgetter(1, 3, 2, 5)(my_dict)
257 ns ± 4.61 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Durchläufen, 1000000 Schleifen pro Durchlauf)

%timeit [my_dict.get(key) for key in req_keys]
604 ns ± 6.94 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Durchläufen, 1000000 Schleifen pro Durchlauf)

%timeit list( map(my_dict.get, req_keys) )
529 ns ± 34.2 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Durchläufen, 1000000 Schleifen pro Durchlauf)

!pip install pydash
from pydash import at

%timeit at(my_dict, 1, 3, 2, 5)
22.2 µs ± 572 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Durchläufen, 10000 Schleifen pro Durchlauf)

%timeit (my_dict.get(key) for key in req_keys)
308 ns ± 6.53 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Durchläufen, 1000000 Schleifen pro Durchlauf)

s = pd.Series(my_dict)

%timeit s[req_keys]
334 µs ± 58.1 µs pro Schleife (Mittelwert ± Standardabweichung von 7 Durchläufen, 1000 Schleifen pro Durchlauf)

5voto

Mosqueteiro Punkte 124

Wenn Sie pandas installiert haben, können Sie es in eine Serie umwandeln, bei der die Schlüssel als Index verwendet werden. Also etwas wie

import pandas as pd

s = pd.Series(my_dict)

s[['key1', 'key3', 'key2']]

2voto

tschlich Punkte 63

Wenn Sie die Zuordnung der Werte zu den Schlüsseln beibehalten möchten, sollten Sie stattdessen eine Dict-Abfrage verwenden:

{key: myDictionary[key] for key in [
  'ersterSchlüssel',
  'zweiterSchlüssel',
  'dritterSchlüssel',
  'vierterSchlüssel',
  'fünfterSchlüssel'
]}

1voto

def get_all_values(verschachteltes_wörterbuch):
    for schlüssel, wert in verschachteltes_wörterbuch.items():
        if type(wert) is dict:
            get_all_values(wert)
        else:
            print(schlüssel, ":", wert)

verschachteltes_wörterbuch = {'ResponseCode': 200, 'Data': {'256': {'StartDate': '2022-02-07', 'EndDate': '2022-02-27', 'IsStoreClose': False, 'StoreTypeMsg': 'Manual Processing Stopped', 'is_sync': False}}}

get_all_values(verschachteltes_wörterbuch)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X