根据列表

时间:2015-11-16 17:08:09

标签: python

使用Python 2.7,我试图从字典中提取一个值,其中键来自一个列表/一组可能的值(并假设如果字典中有任何键,则只有一个可能的键是当下)。例如,我想从字典中获取“名称”值,其中密钥可以是namedisplay_namedisplayNamedisplayname。我可以做一堆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 = ????

我有很多这样的配对要找,所以这就是为什么我在寻找更简单的解决方案。

1 个答案:

答案 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()对于一个集合返回一个任意元素,所以如果你知道这两个集合的交集只能是一个元素,它将始终返回你正在寻找的东西。