如何更简便地统计列表中各数值区间内的元素数量?
更简洁高效的数值区间统计实现方案
当然有更简洁的实现方式!而且还能解决原代码里重复调用count()带来的性能浪费问题——原代码里每次count(i)都会完整遍历一遍列表,数据量大的时候效率很低。下面给你几种更优的写法:
方法1:用collections.Counter(推荐)
这是最简洁且高效的方式,借助标准库的Counter一次完成分组统计,然后遍历区间输出:
from collections import Counter a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28] interval = 3 # 分组并统计每个组的元素数量 group_counts = Counter(x // interval for x in a) # 获取所有需要覆盖的区间范围 min_group = min(group_counts.keys()) max_group = max(group_counts.keys()) # 遍历每个区间输出结果 for group in range(min_group, max_group + 1): print(f"{group*interval} {(group+1)*interval} : {group_counts.get(group, 0)}")
优势:只需要遍历列表一次就能完成统计,时间复杂度为O(n),比原代码的O(n*m)高效得多;代码逻辑清晰,可读性强。
方法2:极简版(更紧凑)
如果追求极致精简,可以把步骤进一步合并,可读性稍降但代码更短:
from collections import Counter a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28] interval = 3 counts = Counter(x//interval for x in a) for g in range(min(counts), max(counts)+1): print(f"{g*interval} {(g+1)*interval} : {counts.get(g,0)}")
方法3:不用额外库的字典统计
如果不想引入Counter,用基础字典也能实现类似效果:
a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28] interval = 3 group_counts = {} for num in a: key = num // interval group_counts[key] = group_counts.get(key, 0) + 1 min_g, max_g = min(group_counts), max(group_counts) for g in range(min_g, max_g + 1): print(f"{g*interval} {(g+1)*interval} : {group_counts.get(g, 0)}")
以上几种方法都能输出和你原代码完全一致的结果,同时在效率和简洁性上都有提升。
内容的提问来源于stack exchange,提问作者wangtianye
相关产品推荐
相关产品推荐

