如何使用字典的子集过滤字典列表?
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()]
我正在尝试查找所有包含我准备好的字典作为子集的字典。我有一个带有 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()]