Python中如何统计两个元组列表中所有字节序列的出现次数(含0次)
解决方案
最高效实现方案(基于collections.Counter)
这个方案的时间复杂度为 O(len(ListB) + len(ListA)),完全不需要嵌套遍历两个列表做匹配,是当前场景的最优解:
- 首先用Counter统计ListB的出现次数,这一步耗时仅和ListB的长度正相关:
from collections import Counter b_counter = Counter(ListB)
- 补全0次出现的序列,根据你的使用场景二选一即可:
场景1:需要拿到包含所有序列计数的完整集合
直接用字典推导式遍历ListA,从Counter中取数,不存在则默认返回0:
full_count = {seq: b_counter.get(seq, 0) for seq in ListA}
场景2:n值较大(比如n≥3,全量序列超过10万),不需要同时持有全量计数
不需要生成完整字典,需要查询某个序列的次数时直接调用b_counter.get(目标序列, 0)即可,能节省大量内存开销。
简化写法(需要保留Counter对象能力)
如果后续需要用到Counter的内置方法(比如most_common取高频序列),可以直接初始化带0值的Counter再做更新,逻辑更直观:
# 先初始化所有可能序列的计数为0 full_counter = Counter({seq: 0 for seq in ListA}) # 传入ListB累加计数,自动覆盖初始0值 full_counter.update(ListB)
效率验证
两种实现的核心都是基于哈希表的O(1)平均读写复杂度,不会出现双列表嵌套匹配的O(len(ListA)*len(ListB))的极差性能:
- 统计ListB的过程是哈希表批量插入,单元素操作平均耗时常数级
- 补全0值的过程是单轮遍历ListA做哈希查询,无额外开销
即便是n=3的场景(全量序列共16777216个),在普通消费级CPU上也可在秒级完成计算。
内容的提问来源于stack exchange,提问作者Athmos
相关产品推荐
相关产品推荐

