【发布时间】:2012-10-25 14:08:25
【问题描述】:
我有一个列表说a = [5,3,1,4,10]。我需要获取列表前两个值的索引,即5 和10 我会得到[0, 4]。 Python 是否为这种情况提供了一种单行代码?
【问题讨论】:
我有一个列表说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]
只是一个 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 更有效。看到这个答案:stackoverflow.com/a/23734295/388951