Python中如何判断含列表的字典是否为另一个含列表字典的子集
判断含列表值的字典是否为子集
直接用set(dict.items()).issubset()的方法行不通,原因有两个:
- 列表是可变类型,无法被哈希,不能直接转换为集合元素,执行时会抛出
TypeError; - 该方法只能判断键值对完全相等,无法满足“列表值是子集”的需求。
实现方案
可以通过自定义函数,分两步验证:
- 确保
dict_2的所有键都存在于dict_1中; - 对每个共同键,验证
dict_2的列表值是dict_1对应列表值的子集。
代码示例:
dict_1 = {'V1': ['2024-11-07', '2024-11-08'], 'V2': ['2024-11-07', '2024-11-08']} dict_2 = {'V1': ['2024-11-08'], 'V2': ['2024-11-07']} def is_dict_subset(sub_dict, main_dict): for key, sub_list in sub_dict.items(): # 检查键是否存在于主字典 if key not in main_dict: return False # 转换为集合后判断子集关系 if not set(sub_list).issubset(set(main_dict[key])): return False return True # 测试 print(is_dict_subset(dict_2, dict_1)) # 输出:True
补充说明
- 把列表转成集合是为了利用集合的
issubset()方法,高效判断元素包含关系; - 如果需要处理列表中的重复元素(比如要求
dict_2列表中元素的重复次数不超过dict_1对应列表的次数),可以用计数器调整逻辑:
from collections import Counter def is_dict_subset_with_duplicates(sub_dict, main_dict): for key, sub_list in sub_dict.items(): if key not in main_dict: return False sub_counter = Counter(sub_list) main_counter = Counter(main_dict[key]) # 检查每个元素的出现次数不超过主字典中的次数 for item, count in sub_counter.items(): if main_counter.get(item, 0) < count: return False return True
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

