【问题标题】:Efficient way to check if dictionary key exists and has value检查字典键是否存在并具有价值的有效方法
【发布时间】:2021-06-30 09:13:44
【问题描述】:

假设有一本像这样的字典:

d = {"key1": "value1", "key2": {"key3": "value3"}}

字典可能包含也可能不包含key2key2 也可能为空。所以为了得到value3,我需要检查key2及其值是否存在非空值,同样适用于key3

现在明显愚蠢的解决方案是这样的:

if 'key2' in d:
    if d['key2']:
        if 'key3' in d['key2']:
            value = d['key2']['key3']

现在,我想知道是否有更简单的解决方案,这样我就不必连续写 3 个ifs。

【问题讨论】:

    标签: python dictionary key-value


    【解决方案1】:

    您可以使用默认值.get()

    val = d.get("key2", {}).get("key3", None)  # <-- you can put something else instead of `None`, this value will return if key2 or key3 doesn't exist
    

    例如:

    d = {"key1": "value1", "key2": {"key3": "value3"}}
    
    val = d.get("key2", {}).get("key3", None)
    
    if not val is None:
        print(val)
    else:
        print("Not found.")
    

    【讨论】:

      【解决方案2】:

      一种方法是预测失败并抓住它:

      try:
          value = d['key2']['key3']
      except (KeyError, TypeError):
          pass
      

      (不要将变量称为类型的名称,这是一种不好的做法,我已将其重命名为d

      KeyError 捕获丢失的键,TypeError 捕获试图索引不是 dict 的内容。

      如果您认为这种故障​​很常见,这可能并不理想,因为 try .. except 块有一些开销。

      在这种情况下,你会被你所拥有的东西困住,尽管我会把它写成:

      if 'key2' in d and d['key2'] and 'key3' in d['key2']:
          value = d['key2']['key3']
      

      或者更清楚一点:

      if 'key2' in d and isinstance(d['key2'], dict) and 'key3' in d['key2']:
          value = d['key2']['key3']
      

      如果您要在else 部分中为value 分配其他内容(如None),您也可以考虑:

      value = d['key2']['key3'] if 'key2' in d and d['key2'] and 'key3' in d['key2'] else None
          
      

      【讨论】:

      • 感谢您的回答!我通常不会按数据类型命名。我只是想举一个愚蠢的例子。结果真的很愚蠢:D
      • 还要考虑 @AndrejKesely 的建议 - 使用 .get() 是提供安全默认值的好方法。
      • 我最终选择了Try-Catch 声明。我一直在寻找一种干净的方法来做到这一点,但如果它有效,为什么要修复它?
      • 这很公平 - 请记住,如果您的代码需要快速连续执行数千或数百万次,那么有些解决方案可能会执行得更好。
      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2019-08-06
      相关资源
      最近更新 更多