如何高效比较两个字典列表匹配数及统计单列表重复字典
字典列表比较与重复统计方案
先给出你的示例数据:
a = [{"colA":"red", "colB":"red", "colC":1},{"colA":"grape", "colB":"orange", "colC":4},{"colA":"tan", "colB":"mustard", "colC":3}] b = [{"colA":"red", "colB":"red", "colC":1},{"colA":"red", "colB":"red", "colC":1},{"colA":"red", "colB":"red", "colC":1, "colD": 3}]
问题1:高效统计列表a中与列表b匹配的字典数量(百万级规模)
嵌套循环遍历a和b的时间复杂度是O(n*m),百万级数据下完全不可行。核心思路是把不可哈希的字典转成可哈希结构,再用集合或计数器实现O(1)级别的查询:
代码实现(统计a中字典在b中的总出现次数)
from collections import Counter def dict_to_tuple(d): # 按键排序生成元组,避免因键顺序不同导致匹配失败 return tuple(sorted(d.items())) # 先把b中所有字典转成可哈希元组,统计频次 b_counter = Counter(dict_to_tuple(item) for item in b) # 遍历a累加匹配次数 match_total = 0 for item in a: t = dict_to_tuple(item) match_total += b_counter.get(t, 0) print(match_total) # 示例输出:2(a中第一个字典在b里出现2次)
如果只需要统计a中有多少个不同字典存在于b中(不考虑b内重复次数),用集合更省内存:
b_set = {dict_to_tuple(item) for item in b} match_count = sum(1 for item in a if dict_to_tuple(item) in b_set) print(match_count) # 示例输出:1(a中仅第一个字典在b里存在)
问题2:统计单个列表内重复字典的数量
同样依赖“字典转可哈希元组”的思路,用Counter统计每个字典的出现次数,再计算重复总数:
代码实现
def count_list_duplicates(lst): tuple_counter = Counter(dict_to_tuple(item) for item in lst) # 重复总数:每个字典出现k次,贡献k-1次重复 total_duplicates = sum(count - 1 for count in tuple_counter.values() if count > 1) # 若需要查看具体重复的字典及次数,可返回:{dict(t): count for t, count in tuple_counter.items() if count >1} return total_duplicates # 统计b的重复数 print(count_list_duplicates(b)) # 输出:2(第一个字典重复了2次) # 统计a的重复数 print(count_list_duplicates(a)) # 输出:0(a中无重复字典)
注意事项
- 如果字典包含不可哈希值(如列表),需要递归把这类值转成可哈希结构(比如列表转元组),否则
dict_to_tuple会报错。 - 百万级数据下,生成元组和Counter的内存占用在Python中是可控的,效率远高于嵌套循环。
内容的提问来源于stack exchange,提问作者Just an engineer
相关产品推荐
相关产品推荐

