Python:对比两个含大量子列表的列表并统计y/z值数量
按x分组统计两列表y/z不同值数量并导出Excel的实现方法
针对你有两个含大量子列表(约28000条)的需求,下面提供两种Python实现方案,兼顾效率和易用性:
方案一:用Pandas实现(推荐,适合大数据量+快速导出Excel)
Pandas对分组统计和Excel导出支持非常友好,处理28000条数据毫无压力。
完整代码
import pandas as pd # 示例数据 list1 = [[1,0,0],[1,0,1],[1,1,0],[1,2,0],[2,0,1],[2,1,1]] list2 = [[1,0,0],[1,0,1],[1,0,2],[1,1,0],[1,1,1],[1,2,0],[1,2,1],[2,0,1],[2,0,2],[2,1,1],[2,1,2],[3,0,1]] # 1. 将列表转为DataFrame df1 = pd.DataFrame(list1, columns=['x', 'y', 'z']) df2 = pd.DataFrame(list2, columns=['x', 'y', 'z']) # 2. 按x分组统计y/z的不同值数量 stat1 = df1.groupby('x').agg( y_unique_list1=('y', 'nunique'), z_unique_list1=('z', 'nunique') ).reset_index() stat2 = df2.groupby('x').agg( y_unique_list2=('y', 'nunique'), z_unique_list2=('z', 'nunique') ).reset_index() # 3. 合并两个统计结果(保留所有x值) final_stat = pd.merge(stat1, stat2, on='x', how='outer').fillna(0) # 4. 导出到Excel final_stat.to_excel('统计结果.xlsx', index=False) # 打印查看结果 print(final_stat)
代码说明
groupby('x'):按x值分组agg(...):指定统计规则,nunique会自动计算列中不同值的数量merge(..., how='outer'):保留两个列表中所有的x值,某列表没有的x对应统计值填充0fillna(0):把缺失值(比如list1没有x=3)补为0,符合统计逻辑
示例输出结果
运行后生成的Excel表格内容如下(对应示例数据):
| x | y_unique_list1 | z_unique_list1 | y_unique_list2 | z_unique_list2 |
|---|---|---|---|---|
| 1 | 3 | 2 | 3 | 3 |
| 2 | 2 | 1 | 2 | 3 |
| 3 | 0 | 0 | 1 | 1 |
完全匹配你描述的统计逻辑(比如list1中x=1时y不同值数量为3,z为2)。
方案二:用标准库实现(无需额外安装依赖)
如果不想安装Pandas,可以用collections.defaultdict手动统计,再用openpyxl导出Excel(需要安装openpyxl:pip install openpyxl)。
完整代码
from collections import defaultdict from openpyxl import Workbook def get_stats(lst): stats = defaultdict(lambda: {'y': set(), 'z': set()}) for x, y, z in lst: stats[x]['y'].add(y) stats[x]['z'].add(z) # 转换为数量统计 result = {} for x, vals in stats.items(): result[x] = { 'y_unique': len(vals['y']), 'z_unique': len(vals['z']) } return result # 示例数据 list1 = [[1,0,0],[1,0,1],[1,1,0],[1,2,0],[2,0,1],[2,1,1]] list2 = [[1,0,0],[1,0,1],[1,0,2],[1,1,0],[1,1,1],[1,2,0],[1,2,1],[2,0,1],[2,0,2],[2,1,1],[2,1,2],[3,0,1]] # 获取两个列表的统计结果 stat1 = get_stats(list1) stat2 = get_stats(list2) # 收集所有x值 all_x = set(stat1.keys()).union(set(stat2.keys())) # 准备Excel数据 wb = Workbook() ws = wb.active ws.append(['x', 'y_unique_list1', 'z_unique_list1', 'y_unique_list2', 'z_unique_list2']) for x in sorted(all_x): row = [ x, stat1.get(x, {'y_unique': 0})['y_unique'], stat1.get(x, {'z_unique': 0})['z_unique'], stat2.get(x, {'y_unique': 0})['y_unique'], stat2.get(x, {'z_unique': 0})['z_unique'] ] ws.append(row) # 保存Excel wb.save('统计结果_标准库版.xlsx')
代码说明
- 用
defaultdict创建嵌套结构,每个x对应y和z的集合(自动去重) - 遍历子列表,把y和z加入对应x的集合中
- 最后通过
len()获取集合大小,即不同值的数量 - 用
openpyxl手动构建Excel表格并保存
内容的提问来源于stack exchange,提问作者Suman KK
相关产品推荐
相关产品推荐

