You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:58:45