Python更新字典值时能否用字典推导式实现集合计数功能?
Python字典推导式实现计数功能解答
完全可以用字典推导式实现你描述的集合列表元素出现次数统计功能,和你给出的defaultdict循环写法效果一致,有多种可选实现方案:
你原代码的逻辑是遍历集合列表中的每个集合,再遍历集合内的所有元素累计计数,属于线性遍历,性能最优。以下是等价的推导式实现方案:
方案1:结合Counter实现(最推荐)
collections模块的Counter是Python官方提供的专门用于计数的字典子类,配合生成器表达式可以一行实现等价功能,时间复杂度同样为O(n)(n是所有元素的总数量),和原代码性能完全一致:
from collections import Counter counts = Counter(elem for set_item in sets for elem in set_item)
得到的counts支持所有原生字典的操作,输出结果和原代码完全相同。
方案2:纯字典推导式实现(无额外导入依赖)
如果不想引入额外模块,也可以用纯字典推导式实现,仅适合小数据量场景:
# 先拉平所有元素得到一维列表 all_elements = [elem for set_item in sets for elem in set_item] # 字典推导式统计每个唯一元素的出现次数 counts = {elem: all_elements.count(elem) for elem in set(all_elements)}
不同方案对比
- 原循环写法:性能最优,适合超大数据量的计数场景,代码量略多
- Counter写法:代码最简洁,可读性最高,性能和原循环写法一致,是绝大多数场景的首选
- 纯字典推导式写法:不需要额外导入模块,但是会重复遍历元素做计数,时间复杂度为O(n*k)(n是总元素数,k是唯一元素数量),数据量大时会有明显性能损耗
内容的提问来源于stack exchange,提问作者sunnyata
相关产品推荐
相关产品推荐

