如何检查未知长度的Python字典列表是否仅含成对重复字典
检查字典列表是否仅含完全成对的字典
需求说明
- 给定一个字典列表,需验证每个字典的出现次数均为偶数(即完全成对)
- 例外规则:仅包含1个条目的列表默认判定为符合要求
解决方案
利用collections.Counter统计字典出现次数,由于字典不可直接哈希,需先将其转换为可哈希的排序元组(保证内容相同的字典被视为同一元素)。
from collections import Counter def is_paired_dicts(list_of_dict): # 处理单元素列表的例外情况 if len(list_of_dict) == 1: return True # 将字典转换为排序后的键值对元组,确保内容相同的字典被统一识别 hashable_dicts = [tuple(sorted(d.items())) for d in list_of_dict] # 统计每个元素的出现次数 count_result = Counter(hashable_dicts) # 检查所有元素的出现次数是否为偶数 return all(count % 2 == 0 for count in count_result.values())
测试示例
符合要求的案例
# 案例1:成对出现的不同字典 test1 = [ {'value_a': '100', 'value_b': '25'}, {'value_a': '200', 'value_b': '10'}, {'value_a': '200', 'value_b': '10'}, {'value_a': '100', 'value_b': '25'}, ] print(is_paired_dicts(test1)) # 输出: True # 案例2:单个字典成对出现 test2 = [ {'value_a': '100', 'value_b': '25'}, {'value_a': '100', 'value_b': '25'}, ] print(is_paired_dicts(test2)) # 输出: True # 案例3:仅含一个条目的列表 test3 = [{'value_a': '100', 'value_b': '25'}] print(is_paired_dicts(test3)) # 输出: True
不符合要求的案例
# 案例1:存在不成对的字典(第二个和第三个字典内容不同) test4 = [ {'value_a': '100', 'value_b': '25'}, {'value_a': '200', 'value_b': '10'}, {'value_a': '200', 'value_b': '17'}, {'value_a': '100', 'value_b': '25'}, ] print(is_paired_dicts(test4)) # 输出: False # 案例2:字典总数为奇数,存在单个未成对的字典 test5 = [ {'value_a': '100', 'value_b': '25'}, {'value_a': '200', 'value_b': '10'}, {'value_a': '100', 'value_b': '25'}, ] print(is_paired_dicts(test5)) # 输出: False # 案例3:两个不同字典各出现一次,均未成对 test6 = [ {'value_a': '100', 'value_b': '25'}, {'value_a': '200', 'value_b': '10'}, ] print(is_paired_dicts(test6)) # 输出: False
说明
- 将字典转换为排序元组是为了避免因字典键的顺序不同导致误判(比如
{'a':1, 'b':2}和{'b':2, 'a':1}会被视为同一个元组) all()函数会遍历所有计数结果,只要有一个计数为奇数就返回False,否则返回True
内容的提问来源于stack exchange,提问作者finethen
相关产品推荐
相关产品推荐

