3

5 つのタプルのリストがあるとします。

(a, b , c, d, e)

リストをstudent_tuplesとします。

フィールドごとに異なる順序でリストをソートしたいと考えています。

以下のコマンド

sorted(student_tuples, key=itemgetter(2,4,0,1))

すべてのフィールドのリストを昇順で並べ替えます。

以下のコマンド

sorted(student_tuples, key=itemgetter(2,4,0,1), reverse=true)

すべてのフィールドのリストを降順で並べ替えます。私が探しているのは、さまざまなフィールドのさまざまな順序でリストをソートすることです。そうする簡単な方法はありますか?

答えに基づいて、この手法はどの言語でも使用できます

ありがとう、ガッジ

4

2 に答える 2

9

値が数値の場合、次を使用してこれを簡単に行うことができますlambda

sorted(student_tuples, key=lambda x: (x[2],x[4],-x[0],x[1]))
                                                #^ This field will be 
                                                #  in descending order 

ラムダ関数内の順序を簡単に否定できない場合は、Pythonの並べ替えの安定性に依存し、数回並べ替える必要があります。

s = sorted(student_tuples, key=itemgetter(1))
s.sort(key=itemgetter(0),reversed=True)
s.sort(key=itemgetter(2,4))

この回答でさらに詳しく説明します。

上記の私の答えが同じことを達成していることの証明(数値入力で):

import random
def rand_tuple():
    """ Return a random 5-tuple """
    return tuple( random.random() for _ in range(5) )

#100 random 5-tuples
lst = [ rand_tuple() for _ in range(100) ] 

#sort the list using method 1
sorted_lst = sorted(lst, key = lambda x: (x[2],x[4],-x[0],x[1])) 

#sort the list in place using method 2
lst.sort(key = itemgetter(1))  #<- Rightmost tuple element first!!!
lst.sort(key = itemgetter(0), reversed = True)
lst.sort(key = itemgetter(2,4))

print (lst == sorted_lst) #True -- Results are the same :-)
于 2012-08-16T18:18:54.923 に答える
1

数値インデックスだけでなく、意味のある属性名を持つクラスを作成できます。それを与えると__cmp__(python 2.x)、または@total_ordering(python 3.x)を追加する__eq__と、簡単にソートできます。__lt__

別のオプションは、タプルを保持し、それらをリストに変換し、逆に並べ替える必要がある数値フィールドを無効にすることです。文字列に対してこれを行うことはできますが、数値ほどきれいではありません。

タプルが高速にソートされる理由の 1 つは、タプルが非常に柔軟ではないことです。

于 2012-08-16T18:23:42.197 に答える