3

質問のタイトルがあいまいで申し訳ありません。
私の質問は、a = [6, 9, 8, 10, 7, 5, 2, 3, 1, 4]
新しい order を取得する必要があるリストがありますb = [4, 2, 3, 5, 1, 6, 10, 8, 7, 9]。ここで、の最初の要素b4、の 4 番目の要素がa 10a の最大数であるためです。同様に、 の 2 番目の要素はb2a の 2 番目に大きい数が 2 番目の数であるためです。9

それで、うまくいけば、あなたは私の質問を得たと思います: Sort the list aand get the new order 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

引数を使用して、の値を使用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)

私はそれenumerateがより少しきれいで、より少しきれいziprangeitemgetter思いますlambda

于 2013-03-01T03:09:42.113 に答える
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
于 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 に答える