Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何知道嵌套字典中的列表中是否存在值_Python - Fatal编程技术网

Python 如何知道嵌套字典中的列表中是否存在值

Python 如何知道嵌套字典中的列表中是否存在值,python,Python,我如何检查字典中是否有“安娜”?挑战似乎正在访问列表中的值: data = {"Pam": {"Job":"Pilot", "YOB": "1986", "Children": ["Greg", "Anna","Sima"]}, "Joe": {"Job":"Engineer", "YOB": "1987"}} 您可以使用具有列表理解功能的any检查'Anna'是否作为字典中的键存在或作

我如何检查字典中是否有“安娜”?挑战似乎正在访问列表中的值:

data = {"Pam": {"Job":"Pilot", 
              "YOB": "1986", 
              "Children": ["Greg", "Anna","Sima"]}, 
        "Joe": {"Job":"Engineer", 
              "YOB": "1987"}}

您可以使用具有列表理解功能的
any
检查
'Anna'
是否作为字典中的键存在或作为子字典中的元素出现:

data = {"Pam": {"Job":"Pilot", 
          "YOB": "1986", 
          "Children": ["Greg", "Anna","Sima"]}, 
    "Joe": {"Job":"Engineer", 
          "YOB": "1987"}}
if any(a == 'Anna' or 'Anna' in b.get('children', []) for a, b in data.items()):
   pass

如果您的字典如上所述,并且您只想测试“Anna”是否在“Pam”子字典的“Children”列表中,您可以简单地执行以下操作:

print("Anna" in data["Pam"]["Children"])
但我想你真的想要更一般的东西

下面是一个递归函数,它将检查由嵌套字典和列表组成的对象,查找给定的值。外部对象可以是dict或list,因此它适合处理从JSON创建的对象。请注意,它忽略dict键,只查看值。它将尽可能深入地递归,以找到匹配的值,但一旦找到匹配,它将停止搜索

def has_value(obj, val):
    if isinstance(obj, dict):
        values = obj.values()
    elif isinstance(obj, list):
        values = obj
    if val in values:
        return True
    for v in values:
        if isinstance(v, (dict, list)) and has_value(v, val):
            return True
    return False

# Test

data = {
    "Pam": {
        "Job": "Pilot",
        "YOB": "1986",
        "Children": ["Greg", "Anna", "Sima"]
    },
    "Joe": {
        "Job": "Engineer",
        "YOB": "1987"
    }
}

vals = ("Pam", "Pilot", "1986", "1987", "1988", "YOB", "Greg", 
    "Anna", "Sima", "Engineer", "Doctor")

for v in vals:
    print(v, has_value(data, v))
输出

Pam False
Pilot True
1986 True
1987 True
1988 False
YOB False
Greg True
Anna True
Sima True
Engineer True
Doctor False
传递给
obj
的has_值必须是dict或list,否则它将失败

UnboundLocalError: local variable 'values' referenced before assignment

你是否特别检查Anna是否是Pam的一个孩子,她是否是任何人的孩子,或者这个名字是否出现在字典的任何地方?这个问题已经在下面的链接中得到了详细的回答:@AnshulPrakash这个问题包括在嵌套的dicts中查找键,但不是价值观。我不知道你真正想要什么,但挑战其实很容易解决,[“格雷格”、“安娜”、“西玛”]
中的“安娜”将返回
True
,[“格雷格”、“玛丽”、“西玛”]中的“安娜”将返回
False