
How to Count Duplicates in a Python List (3 Methods + Examples)
2022/12/29 · 7 min read
How to Count Duplicates in a Python List (3 Methods + Examples)
在日常的 Python 编程和数据处理任务中,统计列表中元素的出现次数(尤其是找出重复元素的出现频次)是一项非常基础且频繁被用到的操作。无论是清洗日志数据,还是在数据分析中统计分类特征,高效地完成这一任务都至关重要。
本文将为您详细介绍三种统计 Python 列表中重复元素次数的经典方法:collections.Counter、**基础循环字典(Loop)**以及数据科学利器 pandas。每种方法都会提供完整、可运行的代码,并在此基础上对比它们的性能和最佳适用场景。
方法一:使用 collections.Counter(推荐 / Pythonic 做法)
Python 内置的 collections 模块提供了一个专门用来计数的容器——Counter。它是 dict 的一个子类,专门用于统计可哈希对象(Hashable Objects)的出现频次。这是最优雅、最符合 Python 编程规范(Pythonic)的解法。
完整运行代码示例
from collections import Counter
# 原始列表
names = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple', 'grape']
# 统计频率
element_counts = Counter(names)
# 输出完整结果
print("所有元素的计数结果:", element_counts)
# 输出结构类似于 dict: Counter({'apple': 3, 'banana': 2, 'orange': 1, 'grape': 1})
# 只筛选出重复的元素(出现次数 > 1)
duplicates = {item: count for item, count in element_counts.items() if count > 1}
print("仅重复元素的计数结果:", duplicates)优点:代码极其简洁,底层由 C 语言优化,执行速度非常快,内存占用小。同时支持非常实用的 .most_common(n) 方法直接获取出现频率最高的 $n$ 个元素。
方法二:使用基础循环与字典(无外部导入 / 底层逻辑)
如果您在编写脚本时不想引入任何外部模块或内置库,或者想对底层的计数逻辑有最直观的控制,那么使用传统的 for 循环搭配字典(dict)是最合适的方法。
完整运行代码示例
# 原始列表
names = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple', 'grape']
# 初始化空字典
count_dict = {}
# 遍历计数
for name in names:
# 如果字典中已有该元素,计数加 1
if name in count_dict:
count_dict[name] += 1
# 否则,初始化计数为 1
else:
count_dict[name] = 1
print("基础循环统计结果:", count_dict)
# (进阶优化)使用 dict.get() 的单行遍历写法
count_dict_optimized = {}
for name in names:
count_dict_optimized[name] = count_dict_optimized.get(name, 0) + 1
print("优化循环统计结果:", count_dict_optimized)优点:不需要任何 import 语句,非常适合基础教学、轻量级脚本或受限环境(如刷算法题)。
缺点:相比 Counter,代码量偏多,且在列表规模非常庞大时,Python 循环的效率会明显慢于 C 优化的内置方法。
方法三:使用 pandas.Series.value_counts(数据分析利器)
如果您的项目本身就是一个数据科学、机器学习或数据分析项目,并且列表中包含了成千上万条记录,那么直接使用 pandas 库的 value_counts() 方法将是最高效、最直观的。
完整运行代码示例
import pandas as pd
# 原始列表
names = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple', 'grape']
# 转换为 pandas Series 对象
series = pd.Series(names)
# 使用 value_counts 统计频次(默认会按频次降序排列)
counts = series.value_counts()
print("Pandas 统计结果(带索引的 Series):")
print(counts)
# 将结果转换为字典
counts_dict = counts.to_dict()
print("转换后的字典格式:", counts_dict)优点:非常适合大型数据集,返回的结果自动按频次降序排列。如果需要进一步的数据过滤、图表绘制或导出(CSV/Excel),可以实现无缝对接。
缺点:具有较重的外部库依赖。如果仅为了统计一个小列表中几个重复元素,引入 pandas 会使得项目冷启动变慢且内存开销增大。
三种统计方法的性能与适用场景对比
| 方法 | 性能 (大型数据集) | 外部依赖 | 代码复杂度 | 最佳适用场景 |
|---|---|---|---|---|
collections.Counter | 优秀 (C 语言级别加速) | 无 (Python 内置) | 极低 (单行调用) | 绝大多数普通项目、日常开发、高频频次统计 |
Loop + Dict | 一般 (纯 Python 循环) | 无 | 中等 (需要循环体) | 面试算法题、受限无库环境、极简单的逻辑实现 |
pandas.value_counts | 极其优异 (向量化计算) | 有 (第三方库) | 低 (配合 Series) | 大型数据清洗、科学计算、后续需进行图表/数据帧分析 |
Related Articles
- Python LTV Fitting — 本站另一篇利用 Python 进行游戏/应用生命周期价值(LTV)拟合与数据分析的实战笔记,欢迎阅读。