使用Python 2.7,我试图从字典中提取一个值,其中键来自一个列表/一组可能的值(并假设如果字典中有任何键,则只有一个可能的键是当下)。例如,我想从字典中获取“名称”值,其中密钥可以是name
,display_name
,displayName
或displayname
。我可以做一堆if-elif
语句,但希望有更优雅的东西。从这些SO answers开始,我相信我也可以这样做:
keys = ['name', 'display_name', 'displayName', 'displayname']
data = {'name': 'Foo',
'baz': 'bim'}
if any(_key in data for _key in keys):
filtered = {k:v for k, v in data.iteritems() if k in keys}
display_name = filtered[filtered.keys()[0]]
虽然这肯定比if-elif
陈述好,但是有一种单行方式吗? (填写????):
keys = ['name', 'display_name', 'displayName', 'displayname']
data = {'name': 'Foo',
'baz': 'bim'}
if any(_key in data for _key in keys):
display_name = ????
我有很多这样的配对要找,所以这就是为什么我在寻找更简单的解决方案。
答案 0 :(得分:2)
如果您知道只有一个密钥匹配:
In [89]: keys = ['name', 'display_name', 'displayName', 'displayname']
data = {'name': 'Foo', 'baz': 'bim'}
data[set(keys).intersection(data.keys()).pop()]
Out[89]: 'Foo'
编辑:解释。 pop()
对于一个集合返回一个任意元素,所以如果你知道这两个集合的交集只能是一个元素,它将始终返回你正在寻找的东西。