如何对列表列表进行排序并仅保留每个第一个元素的最大第二个元素?

Guy*_*Guy 5 python sorting numpy list

假设我有一些清单:

lst = [[2,6],[1,4],[0,1],[1,1],[2,3],[0,2]]
Run Code Online (Sandbox Code Playgroud)

我想按第一个元素对lst进行排序,并为每个子列表保留按第一个元素分组时具有最大第二个元素的那个。

所以结果将是:

results
>>> [[0,2],[1,4],[2,6]]
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我吗?

mat*_*fux 4

您可以使用以下方法来完成np.maximum.reduceat

import numpy as np
lst = np.array([[2,6],[1,4],[0,1],[1,1],[2,3],[0,2]])
lst = lst[np.argsort(lst[:,0])] #sorting lst by first row
u, idx = np.unique(lst[:,0], return_index = True) 
print(np.c_[u, np.maximum.reduceat(lst[:,1], idx)])
Run Code Online (Sandbox Code Playgroud)

首先应该对数组进行排序。然后您需要获取将数组分成组的索引:idx = [0, 2, 4]以及第一列的相应值u = [0, 1, 2]。最后,使用np.maximum.reduceat来获取从idx指定索引开始的组的最大值,并将其向右连接到u

备注:numpy在这里使用了一个广泛使用的库,它允许将循环推入 C 级别,速度要快得多。纯Pythonic解决方案也值得关注。

奖励:这实际上是一个单行代码,使用numpy_indexed专用于数组的 groupby 操作的库(没有广泛使用):

import numpy_indexed as npi
import numpy as np
np.transpose(npi.group_by(lst[:, 0]).max(lst[:, 1]))
Run Code Online (Sandbox Code Playgroud)