Python字典获取多个值
Sry如果这个问题已经存在,但我已经搜索了很长时间了 我有一个python字典,我想做的是从中获取一些值作为列表,但我不知道这个实现是否支持Python字典获取多个值,python,dictionary,Python,Dictionary,Sry如果这个问题已经存在,但我已经搜索了很长时间了 我有一个python字典,我想做的是从中获取一些值作为列表,但我不知道这个实现是否支持 myDictionary.get('firstKey') # works fine myDictionary.get('firstKey','secondKey') # gives me a KeyError -> OK, get is not defined for multiple keys myDictionary['firstKey',
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')
对循环使用
:
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
,请使用
itemgetter(*wanted_keys)(my_dict)
请记住,itemgetter
在仅请求一个键时不会将其输出包装在元组中,并且不支持请求零键。您可以使用At
:
如果回退键不太多,您可以这样做
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
,则可以将其转换为一个系列,并以键作为索引。大概是
将熊猫作为pd导入
s=pd.系列(我的目录)
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)
好的,我已经考虑过了,但是真的没有实现的方法吗?我的意思是,这并不是一件完全奇怪的事情。我想如果保证每个键都在字典中,你可以编写[myDictionary[key]for key in keys]
,但没有比这简单多少。或者[my_dict.get(x)for x in['firstKey',secondKey',thirdKey']
用于单线解决方案,但它尽可能紧凑。好吧,这是不幸的。但是非常感谢你的努力!根据用例的不同,您可能需要一个if
语句来检查get
方法返回的None
值:[mydict.get(key)for key in keys if key in mydict]
这很酷。它不像我想象的那么短,但很高兴知道;)你能缩短多少?如果名称太长g=itemgetter
。o、 OI希望它有一些我找不到的内置语法。当然,你可以把它缩短,但是在任何代码审查中,我都会被问到:wtf是g(mykeys)(myDict):DSmall catch有了这个,itemgetter
至少需要一个参数,所以如果你想做类似itemgetter(*一些键)(一些dict)
,那么,如果some_key
是一个空列表,它将失败。itemgetter不会处理KeyError可能重复的超难搜索问题。很高兴我终于找到了这个!要使其正常工作,您必须使用一个列表来封装map
:values=list(map(mydictionary.get,keys))
,这确实处理了KeyError。我建议在示例中为dict
var选择一个更好的名称。否则,它会隐藏内置的dict
类型。@IvandePazzente不太正确-只是处理了您的评论。谢谢你指出!
>>> a,b,c = [d.get(k) for k in ["foo", "bar", "baz"]]
>>> a,b,c
(1, 2, 3)