根据python中的某个值对列表进行分组,然后返回该组的最小值

Grouping lists based on a certain value in python and then returning the minimum of the group

我有一个看起来像这样的列表:

lst = [(1,23,45,18),(1,42,15,5),(1,29,65,91),(2,35,62,7),(2,72,39,6),(2,41,15,81),(3,45,61,23),(3,41,15,69),(3,12,15,1)]

我想按第一个指标对列表进行分组,因此第 1 组为:

[(1,23,45,18),(1,42,15,5),(1,29,65,91)]

然后 return 该列表在第 4 个指数(18、5 或 91)中具有最小值。所以第 1 组的结果将是:

(1,42,15,5)

理想情况下,结果列表将是最小值列表:

final_lst = [(1,42,15,5),(2,72,39,6),(3,12,15,1)]

如果 lst 按第一个元素排序(如果不是首先使用 lst.sort(key=lambda x: x[0]) 排序),则可以使用 itertools.groupby 按第一个元素对列表进行分组,然后使用min 带有根据最后一个元素比较每个组的键:

from itertools import groupby
out = [min(g, key=lambda x: x[-1]) for k, g in groupby(lst, lambda x: x[0])]

输出:

[(1, 42, 15, 5), (2, 72, 39, 6), (3, 12, 15, 1)]

或者如果每个索引的元组数量相同,我们可以通过 sorted + 列表切片获得所需的结果:

out = sorted(lst, key=lambda x: (x[0], x[-1]))[::3]