如何在Python中检查嵌套字典中的值?

2024-10-03 02:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个字典列表listD,其中每个字典都与更多的字典嵌套在一起。e、 g.假设listD的第一个元素是:

listD[0] = {"bar1":{"bar2":{"bar3":1234}}}

现在我想检查listD[I][“bar1”][“bar2”][“bar3”]==1234,对于I=0的第一个元素,这很简单,因为我们可以使用表达式:

^{pr2}$

但我不能简单地写一个循环:

for dictelem in listD:
  if dictelem["bar1"]["bar2"]["bar3"] == 1234:
    print "equals 1234"

这是因为listD的一些dictionary元素的形式可能是

listD[i] = {"bar1":{"bar2":"abcd"}} or
listD[i] = {"bar1":{"bar2":None}} 

如果我试图在“bar3”不存在的时候访问它,就会产生一个错误。在

现在我在代码中手动指定以检查是否存在bar1、bar2和bar3键,以及这些键是否是字典。但这真的很冗长,我很确定有更简单的方法来做,但我不知道怎么做。在


Tags: in元素列表forif字典表达式print
3条回答
def dictcheck(d, p, v):
    if len(p):
        if isinstance(d,dict) and p[0] in d:
            return dictcheck(d[p[0]], p[1:], v)
    else:
        return d == v

传递一个dict d,一个键路径p,以及要检查v的最终值。它将递归地进入dicts,最后检查最后一个值是否等于v。在

^{pr2}$

所以,为了回答您的问题(我想检查一下listD[I][“bar1”][“bar2”][“bar3”]==1234所有I):

all(dictcheck(x, ('bar1','bar2','bar3'), 1234) for x in listD)

在处理嵌套字典时,我认为它们是一个树,其中键构成了值的路径。考虑到这一点,我创建了一个非递归函数dict_path,它接受一个嵌套字典、密钥路径和一个值以防找不到:

def dict_path(dic, path, value_if_not_found=None):
    path = path.split('.')
    try:
        for key in path:
            dic = dic[key]
        return dic
    except (KeyError, TypeError):
        return value_if_not_found

listD = [
    {"bar1": {"bar2": 'abcd'}},
    {"bar1": {"bar2": None}},
    {"bar1": {"bar2": {"bar3": 1234}}},
]

for dic in listD:
    value = dict_path(dic, 'bar1.bar2.bar3')
    if value == 1234:
        print 'Equals 1234:', dic

函数将继续遍历嵌套字典,直到出现以下三种情况之一:

  1. 它发现了有问题的价值。在这种情况下,返回该值
  2. 在此过程中,对象是一个字典,但没有请求的键。在这种情况下,将引发KeyError
  3. 对象不是字典,将引发TypeError

对于情况2和3,我们只返回value_if_not_found

只需按如下方式使用try/except块:

for dictelem in listD:
    try:
        if dictelem["bar1"]["bar2"]["bar3"] == 1234:
            print "equals 1234"
    except TypeError:
        pass

相关问题 更多 >