根据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]
我有一个看起来像这样的列表:
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]