Hoe krijg ik meerdere woordenboekwaarden?

Sorry als deze vraag al bestaat, maar ik ben al geruime tijd aan het zoeken.

Ik heb een woordenboek in python en wat ik wil doen is er enkele waarden uit halen als een lijst, maar ik weet niet of dit wordt ondersteund door de implementatie.

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

Maar is er een manier waarop ik dit kan bereiken? In mijn voorbeeld ziet het er eenvoudig uit, maar laten we zeggen dat ik een woordenboek van 20 items heb en ik wil 5 sleutels krijgen. Is er een andere manier dan te doen

myDictionary.get('firstKey')
myDictionary.get('secondKey')
myDictionary.get('thirdKey')
myDictionary.get('fourthKey')
myDictionary.get('fifthKey')

Antwoord 1, autoriteit 100%

Hier bestaat al een functie voor:

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)

itemgetterretourneert een tuple als er meer dan één argument wordt doorgegeven. Gebruik

. om een ​​lijst door te geven aan itemgetter

itemgetter(*wanted_keys)(my_dict)

Houd er rekening mee dat itemgetterde uitvoer niet in een tuple verpakt wanneer er slechts één sleutel wordt gevraagd, en geen ondersteuning biedt voor het aanvragen van nul sleutels.


Antwoord 2, autoriteit 66%

Gebruik een forlus:

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

of een lijstbegrip:

[myDictionary.get(key) for key in keys]

Antwoord 3, autoriteit 32%

Ik zou de zeer nuttige functie mapwillen voorstellen, waarmee een functie elementsgewijs op een lijst kan werken:

mydictionary = {'a': 'apple', 'b': 'bear', 'c': 'castle'}
keys = ['b', 'c']
values = list( map(mydictionary.get, keys) )
# values = ['bear', 'castle']

Antwoord 4, autoriteit 8%

U kunt Atgebruiken van pydash:

from pydash import at
my_dict = {'a': 1, 'b': 2, 'c': 3}
my_list = at(my_dict, 'a', 'b')
my_list == [1, 2]

Antwoord 5, autoriteit 5%

Omdat ik hier geen vergelijkbaar antwoord zie, is het de moeite waard om erop te wijzen dat je met het gebruik van een (lijst / generator) begrip, die meerdere waarden kunt uitpakken en ze aan meerdere variabelen kunt toewijzen in een enkele regel code:

p>

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

Antwoord 6, autoriteit 4%

Als je pandashebt geïnstalleerd, kun je er een serie van maken met de sleutels als index. Dus zoiets als

import pandas as pd
s = pd.Series(my_dict)
s[['key1', 'key3', 'key2']]

Antwoord 7, autoriteit 3%

Ik denk dat het begrijpen van lijsten een van de schoonste manieren is waarvoor geen extra invoer nodig is:

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

Of als u de waarden als individuele variabelen wilt, gebruik dan meervoudige toewijzing:

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

Antwoord 8

def get_all_values(nested_dictionary):
    for key, value in nested_dictionary.items():
        if type(value) is dict:
            get_all_values(value)
        else:
            print(key, ":", value)
nested_dictionary = {'ResponseCode': 200, 'Data': {'256': {'StartDate': '2022-02-07', 'EndDate': '2022-02-27', 'IsStoreClose': False, 'StoreTypeMsg': 'Manual Processing Stopped', 'is_sync': False}}}
get_all_values(nested_dictionary)

Antwoord 9

Als de terugvaltoetsen niet te veel zijn, kun je zoiets doen

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

Antwoord 10

def get_all_values(nested_dictionary):
    for key, val in nested_dictionary.items():
        data_list = []
        if type(val) is dict:
            for key1, val1 in val.items():
                data_list.append(val1)
    return data_list

Other episodes