如何得到多个字典值?

我有一个 Python 中的 dictionary,我想要做的是以列表的形式从中获取一些值,但是我不知道这个实现是否支持。

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

有什么办法能让我做到吗?在我的例子中,它看起来很简单,但是让我们假设我有一个包含20个条目的字典,并且我想得到5个键。除了做以下事情还有别的办法吗?

myDictionary.get('firstKey')
myDictionary.get('secondKey')
myDictionary.get('thirdKey')
myDictionary.get('fourthKey')
myDictionary.get('fifthKey')
196174 次浏览

使用 for循环:

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

或者列表内涵:

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

已经存在这样一个函数:

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)

如果传递了多个参数,itemgetter将返回一个元组

itemgetter(*wanted_keys)(my_dict)

请记住,当只请求一个键时,itemgetter不会将其输出包装在元组中,并且不支持请求零个键。

你可以使用 At胡言乱语:

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

如果备用键不是太多,您可以做这样的事情

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

我建议使用非常有用的 map函数,它允许函数以元素的方式对列表进行操作:

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


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


# values = ['bear', 'castle']

如果你已经安装了 pandas,你可以把它变成一个以键为索引的序列。比如说

import pandas as pd


s = pd.Series(my_dict)


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

因为我在这里没有看到类似的答案——值得指出的是,通过使用(列表/生成器)理解,您可以解压缩这些多个值,并在一行代码中将它们分配给多个变量:

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

我认为列表内涵是最清洁的方式之一,不需要任何额外的进口:

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

或者,如果您希望将这些值作为单独的变量,那么可以使用多重赋值:

>>> a,b,c = [d.get(k) for k in ["foo", "bar", "baz"]]
>>> a,b,c
(1, 2, 3)
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)
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

如果希望保留值到键的映射,则应该使用 dict 理解:

{key: myDictionary[key] for key in [
'firstKey',
'secondKey',
'thirdKey',
'fourthKey',
'fifthKey'
]}

列表内涵方法略有不同。

#doc
[dict[key] for key in (tuple_of_searched_keys)]


#example
my_dict = {x: x**2 for x in range(10)}
print([my_dict[key] for key in (8,9)])

以上所有答案的 %timeit响应。如果错过了一些解决方案,我表示歉意,并且我用我的判断力去寻找类似的答案。itemgetter对我来说似乎是赢家。pydash报告的时间少得多,但我不知道为什么它运行较少的循环,不知道我是否可以称之为最快的。你的想法?

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 per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


%timeit [my_dict.get(key) for key in req_keys]
604 ns ± 6.94 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)




%timeit list( map(my_dict.get, req_keys) )
529 ns ± 34.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)




!pip install pydash
from pydash import at


%timeit at(my_dict, 1, 3, 2, 5)
22.2 µs ± 572 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)




%timeit (my_dict.get(key) for key in req_keys)
308 ns ± 6.53 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


s = pd.Series(my_dict)


%timeit s[req_keys]
334 µs ± 58.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)