フォーマットのタプルのリストがあります:
(node1, node2, weight)
私がやりたいのは、このタプルを並べ替えて、重みの大きいノードが一番上になるようにすることです。
例えば
(A,B,2)
(A,C,5)
(C,A,2)
私に与えるべき
(A,C,5)
(A,B,2)
(C,A,2)
最初のノードはアルファベット順にソートされています。減少する重みランクによる2番目のノード。
フォーマットのタプルのリストがあります:
(node1, node2, weight)
私がやりたいのは、このタプルを並べ替えて、重みの大きいノードが一番上になるようにすることです。
例えば
(A,B,2)
(A,C,5)
(C,A,2)
私に与えるべき
(A,C,5)
(A,B,2)
(C,A,2)
最初のノードはアルファベット順にソートされています。減少する重みランクによる2番目のノード。
これは問題なく機能するはずです。
lst.sort(key=lambda x:x[2], reverse=True)
もちろん、次の方法でラムダを回避できます。
import operator
lst.sort(key=operater.itemgetter(2), reverse=True)
複数の条件で並べ替える場合は、タプルを返す興味深い関数を作成できます(タプルは最初のインデックス、次に2番目、次に3番目...で並べ替えられます)。または、Pythonの並べ替えが安定していることが保証されているという事実を利用できます。したがって、リストを主に重みで並べ替えてからノード名で並べ替える場合は、最初にノード名で並べ替え、次に重みで並べ替えます。(逆順は少し直感に反します)。
私があなたの質問を理解した場合(ここでいくつかのコメントを読み直して見た後)、あなたは次のように分類することができます:
lst.sort(key=lambda x: (-x[2],x[0])) #relying on tuples
これは、主に重み(最初に大きい数値)でソートし、次に同じ重みのオブジェクトの場合はnode1でアルファベット順にソートします。
これは、並べ替えの最初に大きな数値を表示するように否定できる場合にのみ機能することに注意してくださいx[2]
(たとえば、文字列では機能しません)。同じことを達成するためのより信頼できる方法は(効率は劣りますが?)、次のようになります。
lst.sort(key=lambda x: x[0])
lst.sort(key=lambda x: x[2], reversed=True)
「キー機能」を使用します。大きな重みを最初に並べ替える必要があるため、キー関数は重みの負の値を返す必要があります。これにより、大きな重みは低く並べ替えられます。
A='A'
B='B'
C='C'
lst = [(A, B, 2), (A, C, 5), (C, A, 2)]
def weight_key(tup):
return tup[0], -tup[2], tup[1]
lst.sort(key=weight_key)
print(lst) # prints: [('A', 'C', 5), ('A', 'B', 2), ('C', 'A', 2)]
編集:私は質問を読み直しました。これが何を意味するのか正確にはわかりません。「つまり、最初のノードはアルファベット順にソートされています。2番目のノードは重みのランクが下がっています。」
しかし、私はあなたが最初に鍵を置きたいと思います、node1
値でソートします。次に、重量で並べ替えます。最初に最大の並べ替えを行います。次に、node2
値で並べ替えます。このようにソートするタプルを返すようにキー関数を編集しました。