2013-03-01 46 views
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因爲a10第四元件是人數最多的。同樣,在b的第二個元素是2因爲在第二大量的是它的第二個數字9對列表值進行排序以獲取其索引的新順序,Python方式

所以,我希望你得到了我的問題:排序列表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是這樣實現我的目標?
感謝您的任何建議〜

回答

6

我只是使用key參數,使用a的值對range(1, len(a) + 1)進行排序。

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

輝煌。我希望我能想到它。 +1 – mgilson 2013-03-01 03:12:12

+0

我同意@mgilson - 非常非常好......'範圍'可以使'len(a)+ 1'結束,使它更通用,但是哇... +1 – 2013-03-01 03:20:08

+0

謝謝。我已經改變它使用'len(a)+ 1'。 – grc 2013-03-01 03:24:32

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是乾淨了一點比ziprangeitemgetterlambda乾淨了一點。

+0

我認爲''itemgetter(1)''就足夠了。而且它甚至可以使用''itemgetter'':''b = [x [0] for sort in(enumerate(a,1),key = lambda x:-x [1])]'' – eyquem 2013-03-01 05:08:46

+1

它足夠了。我只是保持OP的代碼。 'itemgetter'永遠不需要*。正如我所說的,我認爲這是一個更清潔 - 與反轉= True相比,否定'x [1]'。 ('reverse = True'也適用於字符串) – mgilson 2013-03-01 05:15:57

+0

我同意你 – eyquem 2013-03-01 05:27:46

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 
-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) 

我剛剛得到了這個愚蠢的答案...

相關問題