对列表进行排序,然后按原始顺序给出元素的索引

时间:2014-08-28 02:02:43

标签: python list sorting

我有一个n个数字的数组,比如[1,4,6,2,3]。排序的数组是[1,2,3,4,6],旧数组中这些数字的索引是0,3,4,1和2.给定n个数组的最佳方法是找到这个数组索引?

我的想法是为每个元素运行订单统计信息。但是,由于我必须多次重写这个功能(比赛中),我想知道是否有一个简短的方法来做到这一点。

4 个答案:

答案 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]