有一个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 :(得分: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
以了解您是否找到了某些内容或不。