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

3

我正在尝试查找包含我的字典作为子集的所有字典。 我有一个具有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循环,只有当字典与迭代相同才会添加。如何找到包含my_dict的所有字典子集?你有什么建议?

1
你想要实现什么有点混乱。你只是将 all_dict 复制到 result 中并打印了列表。此外,输出有什么特别之处吗?所有元素都被单独打印在一行中。这是你想要做的吗? - Yoshikage Kira
我不知道如何在my_dict是i的子集时返回true。我无法弄清楚方法是什么。 - Murat Demir
4个回答

3

您可以使用列表推导式,对于列表中的每个字典,检查my_dict的键是否是该字典键的子集

[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'}]

2
最终我找不到issubset方法,非常感谢。那就是我想要的所有内容。 - Murat Demir
它仅适用于“集合”。 - ThePyGuy
1
哦,因为这个我找不到。非常感谢你。这真的很简单。 - Murat Demir

2

利用 dict.items() 返回类似集合的对象,可以进行如下比较:

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

issubset方法也可以用,但是这个更有意义。谢谢。 - Murat Demir
2
@Murat:<=完全与issubset()执行的操作一样(根据set文档)。 - martineau
@martineau 因为我有将近2GB的数据要过滤,所以我会尝试两种方法。谢谢。 - Murat Demir
@Murat:这与<=issubset()有什么关系? - martineau

1

没有使用issubset()的示例。

尝试使用all()

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

1
你可以定义一个函数来测试字典 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)

我知道这个方法,但是我的字典里有将近20个键。 - Murat Demir
我可能有所遗漏,但我不理解为什么那是一个问题。您能否请澄清一下? - Seon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接