我有一个列表,比如说a = [5,3,1,4,10]
。我需要获取列表中前两个最大值的索引,对于5
和10
,我需要得到[0, 4]
。在Python中是否有一行代码可以实现这样的操作?
sorted(range(len(a)), key=lambda i: a[i])[-2:]
sorted(range(len(a)), key=lambda i: a[i], reverse=True)[:2]
或
import operator
zip(*sorted(enumerate(a), key=operator.itemgetter(1)))[0][-2:]
或者(对于长列表),考虑使用heapq.nlargest
。
zip(*heapq.nlargest(2, enumerate(a), key=operator.itemgetter(1)))[0]
list(zip(...))[0]
。 - Joseph只是 NumPy 的替代品:
import numpy as np
top_2_idx = np.argsort(a)[-2:]
top_2_values = [a[i] for i in top_2_idx]
numpy
,那么使用 argpartition
比使用 argsort
更有效率。请参考此回答:https://dev59.com/h2w05IYBdhLWcg3w_Gqw#23734295 - danvk正如danvk所建议的那样,我们可以使用numpy的argpartion方法来获得良好的效率,例如this answer。
如果我们需要两个顶部索引,我们可以使用以下示例代码:
import numpy as np
# Find two top indexes
ind = np.argpartition(a, -2)[-2:]
# Sort them
ind = ind[np.argsort(a[ind])]