如何检查python中字典内的内部字典中是否存在键?

时间:2017-05-18 06:13:59

标签: python dictionary

有一个python字典:

a = {b:{c:{"x":1, "y":2, "z":3}}}

我想知道a[b][c]["z"]是否存在, 但我不知道a[b][c]a[b]是否存在。

所以,如果我这样做:

if "z" in a[b][c]:

我可能会收到"key c doesn't exist in a[b]""key b doesn't exist in a"错误。

在这种情况下如何正确检查[b] [c]中是否存在z?

3 个答案:

答案 0 :(得分:5)

python方式根本不打扰检查。

a[b][c]["z"]

此处字典中可能缺少a,b,“z”的任意组合,但它们都将被异常处理程序捕获。 OTH,存在确切密钥的情况将导致代码的其余部分被执行。

您可能还想考虑使用defaultdict

  

第一个参数提供default_factory的初始值   属性;它默认为None。所有剩余的参数都被处理   就像它们传递给dict构造函数一样,包括   关键字参数。

这使您可以确保A之类的符号始终执行时没有错误,并且在某些情况下可能很有用,特别是在您试图避免使用样板代码的情况下。

答案 1 :(得分:3)

如果由于某种原因你不能使用异常(例如lambda func,list comprehension,generator expression等)

value = a.get(b, {}).get(c, {}).get("z", None)

但通常你应该更喜欢使用异常处理程序

答案 2 :(得分:0)

为什么不使用自己的功能,它为您提供灵活性,递归!

def _finditem(obj, key):
    if key in obj: return obj[key]
    for k, v in obj.items():
        if isinstance(v,dict):
            item = _finditem(v, key)
            if item is not None:
                return item

当然,如果您的任何词典中包含None值,则会失败。在这种情况下,您可以为此函数设置一个标记object(),如果您没有找到任何内容,则返回该标记 - 然后您可以检查sentinel以了解您是否找到了某些内容或不。