-1

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

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)]

然后返回列表在第 4 个索引(18、5 或 91)中具有最小值。所以第 1 组的结果是:

(1,42,15,5)

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

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

1 回答 1

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]
于 2022-03-02T20:46:15.090 回答