加载中

Robin iconRobin
Python

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)大型数据清洗、科学计算、后续需进行图表/数据帧分析

  • Python LTV Fitting — 本站另一篇利用 Python 进行游戏/应用生命周期价值(LTV)拟合与数据分析的实战笔记,欢迎阅读。

相关文章