【问题标题】:Get value from dictionary for first key that exists [duplicate]从字典中获取存在的第一个键的值[重复]
【发布时间】:2018-05-11 12:01:53
【问题描述】:

TL;DR

是否有 Python 字典方法或简单表达式为字典中存在的第一个键(来自可能的键列表)返回一个值?

详情

假设我有一个包含许多键值对的 Python 字典。不能保证任何特定密钥的存在。

d = {'A':1, 'B':2, 'D':4}

如果我想获取给定键的值,并在该键不存在时返回一些其他默认值(例如None),我只需这样做:

my_value = d.get('C', None) # Returns None

但是,如果我想在默认为最终默认值之前检查多个可能的键怎么办?一种方法是:

my_value = d.get('C', d.get('E', d.get('B', None))) # Returns 2

但是随着备用键数量的增加,这变得相当复杂。

是否存在适用于这种情况的 Python 函数?我想像:

d.get_from_first_key_that_exists(('C', 'E', 'B'), None) # Should return 2

如果不存在这样的方法,有没有这种场景常用的简单表达方式?

【问题讨论】:

  • 写出你的预期输出
  • @sachindubey 添加了我的预期输出。

标签: python dictionary lookup


【解决方案1】:

什么都不存在。

x = ["1", "3"]
d = {'1': 1, '2': 2, '3': 3}
d[[k for k in x if x in d][0]]

只需使用列表推导即可。

编辑:奖励积分:

all_matches = [d[k] for k in x if x in d]
all_matches[0]

如果你想要所有可能的键(如果你不想要效率低下)

【讨论】:

    【解决方案2】:

    你可以这样做

    dict_keys=yourdict.keys()
    expected_keys=['a','b','c']
    
    result= list(set(dict_keys).intersection(set(expected_keys)))
    if result:
        for i in expected_keys:
            if i in result:
                yourdict.get(i)
    

    【讨论】:

    • 编辑了代码
    • 这可能比我的好,你打败了我。理想情况下,我们可以通过其他一些安全的方式取消需要 if 缩进。
    • 这将使用一个可能的键,但不一定使用存在的第一个键(集合不排序)。
    • 我已经编辑了我的代码,现在它将获得预期键中第一个键的值
    • 如果数据很大,这种方法可能效率低下(它必须首先找到所有相交的键,即使只需要一个)。
    【解决方案3】:

    使用普通的老for循环,流程控制最清晰:

    for k in 'CEB':
        try:
            v = d[k]
        except KeyError:
            pass
        else:
            break
    else:
        v = None
    

    如果你想单行,可以使用类似理解的语法:

    v = next((d[k] for k in 'CEB' if k in d), None)
    

    【讨论】:

    • 不错! for 循环肯定更明确,但我真的很喜欢理解示例,尤其是使用 next
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2016-09-03
    • 2019-02-04
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多