如何用Python高效分析关联多CSV文件行并取数值最大值
最优解决方案:哈希表(字典)分组 + 逐文件迭代
核心思路
用复合键(date+time+name1+name2的组合)作为哈希表的键,值存储每个number字段的当前最大值。遍历所有CSV文件的每一行,对每行生成复合键后,更新哈希表中对应键的各number最大值。这种方法的时间复杂度是O(N)(N为所有文件的总行数),远优于暴力匹配的O(N²)。
具体实现步骤
- 定义复合键:把每行的
date、time、name1、name2组合成唯一标识。比如用元组(Python中直接用(date, time, name1, name2)作为键,因为元组可哈希),或者用特殊分隔符拼接成字符串(比如date|time|name1|name2,注意选不会出现在字段内容里的分隔符)。 - 初始化哈希表:创建一个字典,键是复合键,值是一个包含7个元素的集合(或字典),初始值设为负无穷,用来记录每个
number字段的最大值。 - 逐文件逐行处理:
- 读取每个CSV文件的每一行,解析出
date、time、name1、name2以及number1到number7(注意把number字段转成数值类型,避免字符串比较出错)。 - 生成复合键后,检查哈希表中是否存在该键:
- 不存在的话,直接把当前行的7个
number值存入哈希表对应位置。 - 存在的话,逐个比较当前行的每个
number和哈希表中对应位置的值,保留较大的那个。
- 不存在的话,直接把当前行的7个
- 读取每个CSV文件的每一行,解析出
- 输出结果:遍历哈希表的键值对,把复合键拆回
date、time、name1、name2,加上对应的7个最大值,整理成需要的格式(比如CSV)输出。
方案优势
- 哈希表的查找和更新都是平均O(1)的操作,全程只遍历所有行一次,没有嵌套循环,彻底避免暴力匹配的重复比较。
- 可以逐行读取文件,不需要一次性加载所有数据到内存,内存占用仅和唯一复合键的数量有关,适合处理大文件场景。
注意事项
- 复合键要保证唯一性:如果字段内容可能包含分隔符,优先用元组作为键,避免键冲突。
- 空值处理:提前定义
number字段为空时的规则,比如忽略空值、视为0或负无穷。
内容的提问来源于stack exchange,提问作者ribicapongo
相关产品推荐
相关产品推荐

