2017-05-18 39 views
1

有一个Python字典:如何检查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?

+0

你试过我的回答吗? – e4c5

+0

是的,显然它工作。但我想知道是否有办法做到这一点,而不使用try/except语句。所以约翰拉罗伊的回答是我寻求的答案。 – alwbtc

回答

3

如果您不能使用异常出于某种原因(如拉姆达FUNC,列表解析,生成表达等)

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

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

5

蟒蛇的方式是不打扰与检查。

try: 

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

except KeyError: 
    print 'Sorry wrong key' 

这里的a,b,“Z”从字典也许缺少的任意组合,但他们都将异常处理程序捕获。 OTH,确切密钥存在的情况会导致代码的其余部分被执行。

您可能还需要考虑使用defaultdict

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

这给了你,像符号将a[b][c]["z"]总是出错误的执行,也许有用在某些情况下,尤其是当你要设法避免boilerplatish代码的保证。

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以了解您是否找到了某些东西。

+0

这更像是一个树型搜索。这似乎与OP所要求的不同。 –

+0

接近树搜索,因为你不知道字典嵌套了多少,它可以达到'n级'。这不是比使用长语法更好的方法吗? –

+0

虽然这个问题把它缩小到两个。 –

相关问题