如何使用字典的子集过滤字典列表?

How can I filter a dict list with subset of a dict?

我正在尝试查找所有包含我准备好的字典作为子集的字典。我有一个带有 2 个键的字典,列表中有 5 个字典。我正在尝试过滤所有包含我的字典的字典:

my_dict = {'A':'A','B':'B'}

all_dict = [{'A':'A','B':'B','C':'C'},{'A':'A','B':'B','C':'C','D':'D'},{'D':'D','E':'E'},{'A':'A','B':'B'},{'A':'A','D':'D'}]

result = []
for i in all_dict:
    if my_dict in i:
       result.append(i)

print(result)

#print output empty list

#output supposed to:
#{'A': 'A', 'B': 'B', 'C': 'C'}
#{'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D'}
#{'A': 'A', 'B': 'B'}

根据我的 for 循环,如果 dict 与迭代完全相同,它会附加。我怎样才能找到所有的字典都包含 my_dict 作为一个子集?你有什么建议?

您可以定义一个函数来测试字典 dict_1 是否是 dict_2 的子集:

def is_subset(dict_1, dict_2):
    for k, v in dict_1.items():
        if k not in dict_2 or dict_2[k]!=v:
            return False
    return True

您的代码将变为:

my_dict = {'A':'A','B':'B'}

all_dict = [{'A':'A','B':'B','C':'C'},{'A':'A','B':'B','C':'C','D':'D'},{'D':'D','E':'E'},{'A':'A','B':'B'},{'A':'A','D':'D'}]

result = []
for i in all_dict:
    if is_subset(my_dict, i):
        result.append(i)

print(result)

您可以使用列表理解,对于列表中的每个字典,查看 my_dict 的键是否是字典键的 subset:

[each for each in all_dict if set(my_dict).issubset(each)]

#output:
[{'A': 'A', 'B': 'B', 'C': 'C'}, {'A': 'A', 'B': 'B', 'C': 'C', 'D': 'D'}, {'A': 'A', 'B': 'B'}]

没有 issubset() 的示例。

尝试使用 all()

result = [i for i in all_dict if all(grp in i.items() for grp in my_dict.items())]

利用 dict.items() returns 可以像这样比较的类集合对象这一事实:

result = [x for x in all_dict if my_dict.items() <= x.items()]