获取列表中前N个值的索引位置

83

我有一个列表,比如说a = [5,3,1,4,10]。我需要获取列表中前两个最大值的索引,对于510,我需要得到[0, 4]。在Python中是否有一行代码可以实现这样的操作?


当你说“values”时,你只是指int?floats?numeric?string?任意对象?最好给出一个测试混合类型的示例列表。 - smci
3个回答

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

1
在Python 3中,zip函数返回一个可迭代对象。因此,最后的代码会稍作修改:list(zip(...))[0] - Joseph

34

只是 NumPy 的替代品:

import numpy as np

top_2_idx = np.argsort(a)[-2:]
top_2_values = [a[i] for i in top_2_idx]

6
如果您愿意使用 numpy,那么使用 argpartition 比使用 argsort 更有效率。请参考此回答:https://dev59.com/h2w05IYBdhLWcg3w_Gqw#23734295 - danvk

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接