用Python排序列表以获取索引的新顺序

3 投票
4 回答
639 浏览
提问于 2025-04-17 17:32

抱歉我问题标题写得不太清楚。
我的问题是,我有一个列表 a = [6, 9, 8, 10, 7, 5, 2, 3, 1, 4]
我想得到一个新的顺序 b = [4, 2, 3, 5, 1, 6, 10, 8, 7, 9],其中 b 的第一个元素是 4,因为 a 中的第4个元素 10 是最大的数字。同样,b 的第二个元素是 2,因为 a 中的第二大数字是它的第二个数字 9

所以,希望你能理解我的问题:对列表 a 进行排序,得到新的顺序 b

目前,我是通过使用 list.sort 并做了一些准备工作来完成这个任务的。

tmp = zip(range(1,11), a)
tmp.sort(key=lambda x:(-x[1],x[0]))
b = [x[0] for x in tmp]

我想知道有没有更好的 Python 方法来实现我的目标?
谢谢任何建议~

4 个回答

1

你可以使用 sortedenumerate 这两个工具:

print [el[0] for el in sorted(enumerate(a, start=1), key=lambda L: L[1], reverse=True)]
# [4, 2, 3, 5, 1, 6, 10, 8, 7, 9]

为了全面起见,这里还有一个使用 numpy 的替代方法(如果你将来有机会用到的话):

np.argsort(a)[::-1] + 1
2

这基本上就是这个想法,不过你可以这样做:

import operator
tmp = sorted(enumerate(a,1),key=itemgetter(1,0),reverse=True)
b = [x[0] for x in tmp]

#In python2.x, the following are equivalent to the list comprehension.
#b = zip(*tmp)[0]
#b = map(itemgetter(0),tmp)

我觉得用 enumerate 比用 zip 搭配 range 更简洁,而 itemgetter 比用 lambda 更干净。

6

我会直接使用 key 这个参数,来根据 a 的值对 range(1, len(a) + 1) 进行排序。

sorted(range(1, len(a) + 1), key=lambda i: a[i-1], reverse=True)

撰写回答