python - 排序列表的反向索引

标签 python sorting

我想返回排序列表的“reverse”索引。我的意思是:我有一个未排序的列表 U,我通过 S=sorted(U) 对它进行排序。现在,我可以获得满足 U(idx)=S 的排序索引 - 但我想要 S(Ridx) = U

举个例子:

U=[5,2,3,1,4]

S=sorted(U)

idx = [U.index(S[i]) for i in range(len(U))]
>>> idx
[3, 1, 2, 4, 0]

Ridx = [S.index(U[i]) for i in range(len(U))]
>>> Ridx
[4, 1, 2, 0, 3]

>>>[U[idx[i]] for i in range(len(U))] == S
True

>>>[S[Ridx[i]] for i in range(len(U))] == U
True

我需要的是一种获取 Ridx 的有效方法。

谢谢!


编辑:

好的!我对回答问题的两种解决方案(@Jon Clements 和@Whatang)做了一点速度测试。

脚本:

import datetime as DT
import random

U=[int(1000*random.random()) for i in xrange(pow(10,8))]

S=sorted(U)

idx = sorted(xrange(len(U)), key=U.__getitem__)

T0 = DT.datetime.now()
ridx = sorted(xrange(len(U)), key=idx.__getitem__)
print [S[ridx[i]] for i in range(len(U))]==U
elapsed = DT.datetime.now()-T0
print str(elapsed)

print '==============='
T0 = DT.datetime.now()
ridx = [ y for (x,y) in sorted(zip(idx, range(len(idx)))) ]
print [S[ridx[i]] for i in range(len(U))]==U
elapsed = DT.datetime.now()-T0
print str(elapsed)

结果:

True
0:02:45.278000
===============
True
0:06:48.889000

感谢大家快速而有意义的帮助!

最佳答案

我能想到的最有效的方法(除了可能查看 numpy)摆脱了 .index 并且可以同时用于 idxridx:

U=[5,2,3,1,4]
idx = sorted(xrange(len(U)), key=U.__getitem__)
ridx = sorted(xrange(len(U)), key=idx.__getitem__)
# [3, 1, 2, 4, 0] [4, 1, 2, 0, 3]

关于python - 排序列表的反向索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18345620/

相关文章:

java - JTable 中的日期排序无效

python列之间所有可能的产品

python - 为什么 python 在我的字符串中的单引号之前添加 "\\"

python - 更改日期对象 Python 的时区

MySQL SWITCH CASE 多重排序依据

php - 如何考虑本地化对数组进行排序?

java - 用不同的值替换文本文件的第二列(正则表达式)

python - 我如何阅读特定行和该行下的 7 行

php - 如何管理动态排序、mysql 和 php 的 order_by 列

php - MySQL 中的日期排序