如何高效获取键值对元组列表中各键对应的最大元组?
嘿,这个需求很典型,我给你两种高效的实现思路,你可以根据实际场景选:
方法一:字典遍历(最优高效,O(n)时间复杂度)
这种方法只需要遍历一次原列表,用字典来记录每个键对应的最大值,最后再把字典转回元组列表。因为是线性遍历,处理大数据量的时候速度优势特别明显,完全不用额外排序操作。
代码示例:
original_list = [(2,8),(5,10),(2,5),(3,4),(5,50)] max_dict = {} for key, value in original_list: # 要么键没出现过,要么当前值比字典里存的大,就更新 if key not in max_dict or value > max_dict[key]: max_dict[key] = value # 把键值对转成元组列表 result = list(max_dict.items()) print(result) # 输出: [(2, 8), (5, 50), (3, 4)]
方法二:itertools.groupby(适合需要排序的场景,O(n log n)时间复杂度)
如果你希望结果里的键是按排序后的顺序排列的,可以用groupby来实现。不过要注意,groupby只会把连续相同的键归为一组,所以必须先把原列表按键排序,这就带来了O(n log n)的时间开销,适合对顺序有要求的场景。
代码示例:
from itertools import groupby from operator import itemgetter original_list = [(2,8),(5,10),(2,5),(3,4),(5,50)] # 先按元组的第一个元素(键)排序 sorted_list = sorted(original_list, key=itemgetter(0)) # 按键分组,每组里取值最大的元组 result = [max(group, key=itemgetter(1)) for _, group in groupby(sorted_list, key=itemgetter(0))] print(result) # 输出: [(2, 8), (3, 4), (5, 50)]
简单总结下:如果键的顺序无所谓,优先选第一种方法,速度最快;如果需要排序后的键顺序,就用第二种。
内容的提问来源于stack exchange,提问作者Gitta Grün
相关产品推荐
相关产品推荐

