我有一个n个数字的数组,比如[1,4,6,2,3]
。排序的数组是[1,2,3,4,6]
,旧数组中这些数字的索引是0,3,4,1和2.给定n个数组的最佳方法是找到这个数组索引?
我的想法是为每个元素运行订单统计信息。但是,由于我必须多次重写这个功能(比赛中),我想知道是否有一个简短的方法来做到这一点。
答案 0 :(得分:14)
>>> a = [1,4,6,2,3]
>>> [b[0] for b in sorted(enumerate(a),key=lambda i:i[1])]
[0, 3, 4, 1, 2]
说明:
enumerate(a)
返回元组的枚举,这些元组由原始列表中的索引和值组成:[(0, 1), (1, 4), (2, 6), (3, 2), (4, 3)]
然后sorted
根据原始值(每个元组的第1项)对key
lambda i:i[1]
个排序进行排序。
最后,列表推导[b[0] for b in
... ]
返回原始索引(每个元组的第0项)。
答案 1 :(得分:1)
这是另一种方式:
>>> sorted(xrange(len(a)), key=lambda ix: a[ix])
[0, 3, 4, 1, 2]
此方法不是对原始列表进行排序,而是使用原始列表作为排序键对其索引(使用xrange
创建)进行排序。
答案 2 :(得分:0)
如果要对数据进行大量统计,则使用numpy数组而不是列表可能会有所帮助。如果您选择这样做,这将有效:
import numpy as np
a = np.array( [1,4,6,2,3] )
b = np.argsort( a )
argsort()也可以对列表进行操作,但我相信在这种情况下,它只是将数据首先复制到数组中。
答案 3 :(得分:0)
这应该可以解决问题:
from operator import itemgetter
indices = zip(*sorted(enumerate(my_list), key=itemgetter(1)))[0]