Python字典获得多个值


78

抱歉,这个问题已经存在,但是我已经搜索了很长时间。

我在python中有一个字典,我想从列表中获取一些值,但是我不知道实现是否支持它。

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


1
超级难的问题要寻找。很高兴我终于找到了!
斯蒂芬

Answers:


56

使用for循环:

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

或列表理解:

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

2
好的,我已经考虑过了,但是真的没有实现的方法吗?我的意思是,这并不是完全奇怪的事情
PKlumpp 2014年

1
如果保证键中的每个键都在字典中,则可以编写[myDictionary[key] for key in keys],但是没有比这更简单的了。
timgeb 2014年

4
[my_dict.get(x) for x in ['firstKey', 'secondKey', 'thirdKey']]单线解决方案,但它会变得紧凑。
Padraic Cunningham 2014年

1
好的,那是不幸的。但非常感谢您的努力!
PKlumpp 2014年

根据用例,您可能希望if语句检查Noneget方法返回的值: [mydict.get(key) for key in keys if key in mydict]
Carolyn Conway

88

为此已经存在一个功能:

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,请使用

itemgetter(*wanted_keys)(my_dict)

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


这很酷。它没有我预期的那么短,但是很高兴知道;)
PKlumpp

2
你能缩短多少?如果名字太长... g = itemgetter。oO
Veedrac

我希望它具有一些我找不到的内置语法。当然,您可以简化它,但是在任何代码审查中,我都会被问到:wtf是g(mykeys)(myDict):D
PKlumpp 2014年

2
小问题itemgetter在于,至少需要一个参数,因此,如果您要执行类似的操作itemgetter(*some_keys)(some_dict),则如果some_keys为空列表,它将失败。
Christian Reall-Fluharty,

1
itemgetter将不会处理
KeyError

26

没有人提到过该map函数,它允许一个函数在列表上逐个元素地操作:

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

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

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

要使其mapvalues = list( map(mydictionary.get, keys) )
生效的

确实处理了
KeyError

6

您可以At 从pydash使用:

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

3
我建议dict在示例中为var选择一个更好的名称。否则,它将隐藏内置dict类型。
伊万·德·帕兹

3

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

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

2

如果已pandas安装,则可以将其变成一系列以键为索引的序列。所以像

import pandas as pd

s = pd.Series(my_dict)

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

1

我认为列表理解是不需要任何其他导入的最干净的方法之一:

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

-1

如果后备键不是太多,则可以执行以下操作

value = my_dict.get('first_key') or my_dict.get('second_key')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.