3

对不起,我的问题标题含糊不清。
我的问题是,我有一个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 10是 a 中的最大数字。同理,中的第二个元素b2因为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

4 回答 4

6

我只会使用参数通过使用's 值key进行排序。range(1, len(a) + 1)a

sorted(range(1, len(a) + 1), key=lambda i: a[i-1], reverse=True)
于 2013-03-01T03:10:31.240 回答
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)

我认为这enumeratezipwith更干净rangeitemgetterlambda.

于 2013-03-01T03:09:42.113 回答
1

你可以使用sortedand 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
于 2013-03-01T03:11:08.980 回答
-1
a = [6, 9, 8, 10, 7, 5, 2, 3, 1, 4]
b = [6, 9, 8, 10, 7, 5, 2, 3, 1, 4] 

a.sort(reverse = True)
print(a)
print(b)
c = [b.index(y)+1 for y in a ]
print(c)

我刚刚得到这个愚蠢的答案......

于 2013-03-01T06:39:57.610 回答