You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效比较两个字典列表匹配数及统计单列表重复字典

字典列表比较与重复统计方案

先给出你的示例数据:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:15:36