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

在python中,如何检查字典内的内部字典中是否存在键?,python,dictionary,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]: 我可能会得到一个“a[b]中不存在键c”或“a[b]中不存在键b”错误 在这种情况下,如何正确地检查z是否存在于a[b][c]中?python的方法根本不需要检查 try: value = a[b][c]["z"] # do somethi

有一个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]:
我可能会得到一个
“a[b]中不存在键c”
“a[b]中不存在键b”
错误


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

python的方法根本不需要检查

try:

    value = a[b][c]["z"]
    # do something with value

except KeyError:
    print 'Sorry wrong key'
这里,字典中可能缺少a、b和z的任何组合,但它们都将被异常处理程序捕获。另外,存在确切密钥的情况将导致代码的其余部分被执行

您可能还想考虑使用

第一个参数提供默认工厂的初始值 属性默认为“无”。将处理所有剩余的参数 与将它们传递给dict构造函数相同,包括 关键字参数


这就保证了像
a[b][c][“z”]
这样的符号在执行时总是不会出错,并且在某些情况下可能很有用,特别是在您试图避免使用样板代码的情况下。

python的方法根本不需要检查

try:

    value = a[b][c]["z"]
    # do something with value

except KeyError:
    print 'Sorry wrong key'
这里,字典中可能缺少a、b和z的任何组合,但它们都将被异常处理程序捕获。另外,存在确切密钥的情况将导致代码的其余部分被执行

您可能还想考虑使用

第一个参数提供默认工厂的初始值 属性默认为“无”。将处理所有剩余的参数 与将它们传递给dict构造函数相同,包括 关键字参数


这可以保证像
a[b][c][“z”]
这样的符号在执行时不会出错,并且在某些情况下可能有用,特别是在您试图避免使用样板代码的情况下。

如果您由于某种原因不能使用异常(例如lambda func、列表理解、生成器表达式等)


但通常情况下,如果由于某种原因(例如lambda func、列表理解、生成器表达式等)无法使用异常,则应首选使用异常处理程序


但是通常您应该更喜欢使用异常处理程序,为什么不使用您自己的函数呢?它给了您灵活性和递归性

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

当然,如果您的任何词典中都没有
值,那么这将失败。在这种情况下,您可以为此函数设置sentinel
object()
,并在没有找到任何内容的情况下返回它——然后您可以对照
sentinel
检查是否找到任何内容。

为什么不使用您自己的函数,它为您提供了灵活性、递归性

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

当然,如果您的任何词典中都没有
值,那么这将失败。在这种情况下,您可以为此函数设置sentinel
object()
,并在没有找到任何内容的情况下返回它——然后您可以对照
sentinel
检查是否找到了内容。

这更像是树搜索。这似乎与OP的要求有所不同。接近于树搜索,因为您不知道dict嵌套了多少,所以它可以达到
n级别
。这不是比使用长语法更好的方法吗?尽管问题将其缩小为两个。这更像是树搜索。这似乎与OP的要求有所不同。接近于树搜索,因为您不知道dict嵌套了多少,所以它可以达到
n级别
。这不是比使用长语法更好的方法吗?尽管问题将其缩小为两个。你试过我的答案了吗?是的,显然有效。但我想知道是否有一种不使用try/except语句的方法。约翰·拉鲁伊的答案就是我想要的答案。你试过我的答案吗?是的,很明显它是有效的。但我想知道是否有一种不使用try/except语句的方法。所以约翰·拉鲁伊的答案就是我寻求的答案。