假设我有一个列表:
lst = [[2,6],[1,4],[0,1],[1,1],[2,3],[0,2]]
我想按照第一个元素将 lst 排序,并在按第一个元素分组时保留具有最大第二个元素的子列表。 因此结果将是:
results
>>> [[0,2],[1,4],[2,6]]
有人可以帮我一下吗?
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)])
idx = [0, 2, 4]
和第一列相应的值u = [0, 1, 2]
。最后,使用np.maximum.reduceat
来获取指定索引idx
开始的组的最大值,并将其连接到u
的右侧显示。import numpy_indexed as npi
import numpy as np
np.transpose(npi.group_by(lst[:, 0]).max(lst[:, 1]))
>>> lst = [[2,6],[1,4],[0,1],[1,1],[2,3],[0,2]]
>>> sorted(lst)[1::2]
[[0, 2], [1, 4], [2, 6]]
默认情况下,通过对每个子列表的第1个和第2个值进行排序来对列表进行排序,然后只需切片结果列表以获取每隔一个项目
将列表排序,按第一个元素分组,然后在每个组中保留第二个元素的最大值
import itertools as it
from operator import itemgetter
lst = [[2,6],[1,4],[0,1],[1,1],[2,3],[0,2]]
slst = sorted(lst, key=itemgetter(0))
gs = it.groupby(slst, key=itemgetter(0))
res = [max(v, key=itemgetter(1)) for k,v in gs]
print(res)
生成
[[0, 2], [1, 4], [2, 6]]
numpy
,我会使用itertools.groupby
。这与numpy.unique
类似。 - mathfuximports
。lst = [[2,6],[1,4],[0,1],[1,1],[2,3],[0,2]]
lst = sorted(lst) # Sort the list in increasing order.
lst = [lst[i] for i in range(len(lst)) if i+1 == len(lst) or lst[i+1][0] != lst[i][0]]
# Remove the elements with minimum 2nd element.
print(lst)
输出:
[[0, 2], [1, 4], [2, 6]]
dict
。>>> [*dict(sorted(lst)).items()]
[(0, 2), (1, 4), (2, 6)]
>>> [*map(list, dict(sorted(lst)).items())]
[[0, 2], [1, 4], [2, 6]]
dict
会为每个键保留最后的值,因此如果我们先排序,那么最后的值就是最大的。sorted(dict(sorted(lst)).items())
。 - superb rain
(object_id, x_coordinate)
对的算法。对于每个对象,会有一对坐标,一对是“进入”对象(包括其左坐标),另一对是“离开”对象(包括其右坐标)。虽然如此,就像我的答案中所述,应用dict
不需要太多的工作量,并使其更加通用 :-) - superb rain