Python 字典列表中的匹配键

Python matching keys in list of dicitonaries

我有以下词典列表,其中包含子词典数据:

data2 = [
    {"dep": None},
    {"dep": {
            "eid": "b3ca7ddc-0d0b-4932-816b-e74040a770ec",
            "nid": "fae15b05-e869-4403-ae80-6e8892a9dbde",
        }
    },
    {"dep": None},
    {"dep": {
            "eid": "c3bcaef7-e3b0-40b6-8ad6-cbdb35cd18ed",
            "nid": "6a79c93f-286c-4133-b620-66d35389480f",
        }
    },
]

我有一个匹配键:

match_key = "b3ca7ddc-0d0b-4932-816b-e74040a770ec"

而且我想查看 data2 中每个“dep”键的子词典是否有与我的 match_key 相匹配的 eid。我正在尝试以下操作,但出现 TypeError: string indices must be integers - 我哪里出错了?

我的代码

matches = [
            d["eid"]
            for item in data2
            if item["dep"]
            for d in item["dep"]
            if d["eid"] == match_key
        ]

所以匹配应该 return:

["b3ca7ddc-0d0b-4932-816b-e74040a770ec"]

意味着它在 data2 中找到了这个 id。

当您遍历字典时,每次迭代都会从字典中为您提供一个 key

所以d["eid"]实际上是"eid"["eid"],这是一个无效的表达式。这就是 Python 引发以下异常的原因:

TypeError: string indices must be integers

此外,表达式 d["eid"] 假定每个 d 都包含 eid 键。如果没有,Python 将引发 KeyError.

如果您不确定“eid”是否是字典中的有效键,请改用 .get 方法。

matches = [
    v
    for item in data2
    if item.get("dep")  # Is there a key called dep, and it has a non-falsy value in it
    for k, v in item["dep"].items()  # Iterate over the dictionary items
    if k == "eid" and v == match_key
]

您可以通过直接访问 eid 键的值来做得更好:

matches = [
    d["dep"]["eid"]
    for d in data2
    if d.get("dep") and d["dep"].get("eid") == match_key
]