Python如何高效统计列表中仅出现一次的元素总数量
优化方案
你原来的代码使用双层嵌套循环,时间复杂度为O(n²),列表规模较大时性能会指数级下降,最优优化方案可以将时间复杂度降到O(n),仅需两次线性遍历即可完成统计:
- 第一次遍历统计列表中每个水果的出现次数
- 第二次遍历计数出现次数等于1的元素总数
最快实现方案(推荐)
使用Python标准库内置的collections.Counter完成计数,该工具底层为C实现,性能远高于纯Python代码实现的计数逻辑:
from collections import Counter fruits=['apple','pear','pear','apple','strawberry','lemon','orange','strawberry','tomato','passionfruit'] # 统计每个元素的出现次数 fruit_count = Counter(fruits) # 统计仅出现一次的元素数量 unique_single = sum(1 for cnt in fruit_count.values() if cnt == 1) print(f'There are {unique_single} fruits not duplicated in the fruits list ')
无依赖纯Python实现
如果不想导入标准库模块,也可以用原生字典实现计数,性能同样远优于原来的双层循环:
fruits=['apple','pear','pear','apple','strawberry','lemon','orange','strawberry','tomato','passionfruit'] fruit_count = {} for fruit in fruits: fruit_count[fruit] = fruit_count.get(fruit, 0) + 1 unique_single = sum(1 for cnt in fruit_count.values() if cnt == 1) print(f'There are {unique_single} fruits not duplicated in the fruits list ')
两种实现运行结果都和你原有代码完全一致,对于10万级以上元素的列表,性能提升可以达到数千到数万倍。
内容的提问来源于stack exchange,提问作者Peter Berrett
相关产品推荐
相关产品推荐

