用Python排序列表以获取索引的新顺序
抱歉我问题标题写得不太清楚。
我的问题是,我有一个列表 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
你可以使用 sorted
和 enumerate
这两个工具:
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)