簡體   English   中英

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

[英]How to know if a value exists in a list within a nested dictionary

我如何檢查字典中是否存在“安娜”? 挑戰似乎正在訪問列表中的值:

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

如果您的詞典如上所述,並且您只想測試“ Anna”是否在“ Pam”子詞典的“ Children”列表中,則只需執行以下操作:

print("Anna" in data["Pam"]["Children"])

但我認為您實際上想要更一般的東西。 ;)

這是一個遞歸函數,它將檢查由嵌套字典和列表組成的對象,尋找給定值。 外部對象可以是字典或列表,因此適合處理從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

您傳遞給has_valueobj 必須是字典或列表,否則將失敗

UnboundLocalError: local variable 'values' referenced before assignment

您可以將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM