【问题标题】:How to safely check if a python dictionary has multiple key dictionary pairs stored recursively如何安全地检查python字典是否具有递归存储的多个键字典对
【发布时间】:2017-02-27 13:24:56
【问题描述】:

如果我有一个 dict, d 并且我想检查 d['e']['foo']['bar'] 的值,其中 e 和 foo 是字典,而 bar 给出了一个字符串,有什么方法可以安全地获取该位置的值?除了 try catch 还有什么?

【问题讨论】:

  • 您可以尝试使用collections.defaultdict()s。见stackoverflow.com/questions/5029934/…
  • @synchronizer 然后检查该值是否为“真实”值。谢谢!
  • 为了确定,我正在编写一个快速程序来验证我所说的话。
  • *不,我似乎无法获得多个嵌套的 defaultdict
  • @synchronizer 来自the man himself

标签: python dictionary try-catch


【解决方案1】:

一个好方法是使用reduce

d={'e':{'foo':{'bar':"final value"}}}
l=['e','foo','bar']
print reduce(lambda x,y:x.get(y),l, d)

您可以创建一个function 并将list 传递给它。

输出:final value

【讨论】:

  • @但如果缺少 key-val 对,则会出现异常。我认为添加 .get(y, default) 可以消除这种情况。虽然那时我会得到 None.get 的类型异常
  • @Bren 但无论如何您都必须处理这种情况.....但是在这种方法中,您可以在列表中使用变量值...它是一个通用函数....我将错误处理留给您.....get 的默认值为None。您可以拥有exception der
  • @Bren 这将适用于所有长链以及小链
  • @Bren 对于不需要用户提供try-except 的版本,修改如下:x.get(y) if x else None
  • @FMc .Get 默认返回 None :)
【解决方案2】:

使用get,默认为空字典:

>>> d = {'e':{'foo':{'bar':0}}}
>>> print(d.get('e', {}).get('foo', {}).get('bar'))
0
>>> print(d.get('f', {}).get('doo', {}).get('car'))
None
>>> print(d.get('e', {}).get('foo', {}).get('car'))
None
>>> print(d.get('e', {}).get('doo', {}).get('bar'))
None

【讨论】:

  • 我试图避开长链。但这在技术上是可行的。
【解决方案3】:

一种方法是使用简单的辅助函数:

def dive(d, *ks):
    for k in ks:
        if isinstance(d, dict) and k in d:
            d = d[k]
        else:
            return None
    return d

examples = [
    {},
    {'e': {'foo': 12}},
    {'e': {'foo': {'bar': 999}}},
]

for i, e in enumerate(examples):
    print(i, dive(e, 'e', 'foo', 'bar'))

输出:

(0, None)
(1, None)
(2, 999)

【讨论】:

    【解决方案4】:

    确保键在这个字典中,你可以试试这个:

    if "e" in d:
        print d["e"]
    

    或者尝试使用get方法,如果key不可用则返回默认值。

    如果键在字典中,则返回键的值,否则返回默认值。如果 默认没有给出,它默认为None,所以这个方法永远不会 引发 KeyError。

    d.get("e","default value")
    

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 2013-11-16
      • 2021-12-07
      • 1970-01-01
      • 2017-06-23
      • 2021-12-19
      • 2012-03-27
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多