Python中按col1的men/women/people求col2最大值的优化方案
高效解决列表中指定类别对应数值的最大值问题
嘿,作为Python新手能想到拆分数组的思路已经很不错啦!其实我们有更简洁高效的方案,不用拆分多个数组,只需要一次遍历就能搞定这个需求,下面给你两种实用的方法:
方法一:使用字典跟踪最大值(最直观,适合新手)
我们可以用一个字典来记录每个类别('men'/'women'/'people')当前的最大值,遍历列表的时候逐个比较更新就行,代码逻辑清晰易懂:
# 你的原始数据 data = [['men', 2, '1945-Truman.txt'], ['women', 2, '1945-Truman.txt'], ['people', 10, '1945-Truman.txt'], ['men', 12, '1946-Truman.txt'], ['women', 7, '1946-Truman.txt'], ['people', 49, '1946-Truman.txt'], ['men', 7, '1947-Truman.txt'], ['women', 2, '1947-Truman.txt'], ['people', 12, '1947-Truman.txt'], ['men', 4, '1948-Truman.txt'], ['women', 1, '1948-Truman.txt'], ['people', 22, '1948-Truman.txt'], ['men', 2, '1949-Truman.txt'], ['women', 1, '1949-Truman.txt'], ['people', 15, '1949-Truman.txt'], ['men', 6, '1950-Truman.txt'], ['women', 2, '1950-Truman.txt'], ['people', 15, '1950-Truman.txt'], ['men', 8, '1951-Truman.txt'], ['women', 2, '1951-Truman.txt'], ['people', 9, '1951-Truman.txt'], ['men', 3, '1953-Eisenhower.txt'], ['women', 0, '1953-Eisenhower.txt'], ['people', 17, '1953-Eisenhower.txt']] # 初始化字典,用负无穷确保第一个值能被正确更新 max_values = {'men': -float('inf'), 'women': -float('inf'), 'people': -float('inf')} for item in data: category = item[0] value = item[1] # 如果当前值比字典里存储的最大值大,就更新 if value > max_values[category]: max_values[category] = value # 转成你需要的列表格式(包含文件名的话可以看注释里的扩展写法) result = [[cat, val] for cat, val in max_values.items()] # 扩展:如果需要记录对应最大值的文件名,可以这样写 # max_info = {'men': (-float('inf'), ''), 'women': (-float('inf'), ''), 'people': (-float('inf'), '')} # for item in data: # cat, val, file = item # if val > max_info[cat][0]: # max_info[cat] = (val, file) # result_with_file = [[cat, val, file] for cat, (val, file) in max_info.items()] print(max_values) # 输出:{'men': 12, 'women': 7, 'people': 49}
这个方法的优势是只需要遍历一次数据,时间复杂度是O(n),比拆分多个数组再分别求最大值的效率更高,而且代码也更紧凑。
方法二:使用itertools.groupby(适合熟悉Python标准库的同学)
如果你想尝试更Pythonic的写法,可以用itertools.groupby,不过需要先按类别排序数据,然后分组求最大值:
from itertools import groupby # 先按类别排序(groupby要求数据是有序的) sorted_data = sorted(data, key=lambda x: x[0]) # 分组并求每个组的最大值 max_values = {} for key, group in groupby(sorted_data, key=lambda x: x[0]): # 从每组中取出所有数值,求最大值 max_val = max(item[1] for item in group) max_values[key] = max_val print(max_values) # 输出同样是:{'men': 12, 'women': 7, 'people': 49}
这个写法更简洁,但因为需要先排序,时间复杂度是O(n log n),如果数据量很大的话,第一种方法会更高效。
总结
如果是新手,优先推荐第一种字典跟踪的方法,逻辑清晰容易理解,而且效率更高;如果追求代码简洁,可以试试第二种groupby的写法。两种方法都能避免拆分多个数组的麻烦,而且更符合Python的编程习惯~
内容的提问来源于stack exchange,提问作者Junaid
相关产品推荐
相关产品推荐

