检查嵌套字典值?
Posted
技术标签:
【中文标题】检查嵌套字典值?【英文标题】:Check nested dictionary values? 【发布时间】:2013-09-05 20:32:57 【问题描述】:对于大量嵌套字典,我想检查它们是否包含键。 它们中的每一个都可能有也可能没有嵌套字典之一,所以如果我循环搜索所有这些字典会引发错误:
for Dict1 in DictionariesList:
if "Dict4" in Dict1['Dict2']['Dict3']:
print "Yes"
到目前为止我的解决方案是:
for Dict1 in DictionariesList:
if "Dict2" in Dict1:
if "Dict3" in Dict1['Dict2']:
if "Dict4" in Dict1['Dict2']['Dict3']:
print "Yes"
但这是一个令人头疼的、丑陋的,并且可能不是很有效的资源。 哪种方法是正确的以第一种方式执行此操作,但在字典不存在时不会引发错误?
【问题讨论】:
【参考方案1】:使用 .get()
和空字典作为默认值:
if 'Dict4' in Dict1.get('Dict2', ).get('Dict3', ):
print "Yes"
如果Dict2
键不存在,则返回一个空字典,因此下一个链接的.get()
也将找不到Dict3
,并依次返回一个空字典。然后in
测试返回False
。
另一种方法是抓住KeyError
:
try:
if 'Dict4' in Dict1['Dict2']['Dict3']:
print "Yes"
except KeyError:
print "Definitely no"
【讨论】:
令人惊叹,经过测试和工作,非常感谢。会尽快接受。你真是个忍者。 如果链中有任何None
值的键,第一个提案将失败。例如,测试不适用于Dict1 = 'Dict2': None
。因此,似乎捕获异常是最干净的解决方案。
@AlexO:任何没有.get()
方法的对象都会失败,是的。该代码的工作不是考虑所有可能性。除非您明确需要支持不同的值类型,否则不要捕获该异常,因为这表明其他地方存在错误。
感谢您指出这一点(我目前正在从 Perl 切换,正在寻找 defined($Dict1'Dict2''Dict3')
表达式的 Python 等效项:)【参考方案2】:
try/except 块怎么样:
for Dict1 in DictionariesList:
try:
if 'Dict4' in Dict1['Dict2']['Dict3']:
print 'Yes'
except KeyError:
continue # I just chose to continue. You can do anything here though
【讨论】:
【参考方案3】:以下是任意数量键的概括:
for Dict1 in DictionariesList:
try: # try to get the value
reduce(dict.__getitem__, ["Dict2", "Dict3", "Dict4"], Dict1)
except KeyError: # failed
continue # try the next dict
else: # success
print("Yes")
基于Python: Change values in dict of nested dicts using items in a list。
【讨论】:
以上是关于检查嵌套字典值?的主要内容,如果未能解决你的问题,请参考以下文章