2017-09-17 15 views
0

ベースのPythonで2つ(またはそれ以上のリスト)の値に基づいて要素を1つのリストに並べる適切な方法は何ですか?私は3つのリストを持っていると言う:2つの異なるリストに基づいてリストを注文する

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
Y = [0, 1, 1, 0, 1, 2, 2, 0, 1] 
Z = [2, 1, 2, 1, 2, 1, 2, 1, 1] 

私が最初Zに基づいて、その後Yに基づいてXの値を注文したいです。所望の出力は次のようになります。

["d", "h", "b", "i", "f", "a", "c", "e", "g"] 
+0

要素を注文する方法は私には不明です。 –

答えて

4

あなたは単にzipリストと、その後sortedを使用することができ、プラス開梱:

>>> [i[2] for i in sorted(zip(Z, Y, X))] 
['d', 'h', 'b', 'i', 'f', 'a', 'c', 'e', 'g'] 

のpingそれをzipすることにより最初Z、それは希望与える第二の入力としてYで外側の理解度はZYをもう一度捨て、Xの値を残します。さて、場合にZYの両方が、それは(質問に応じて望ましくないことができる)Xを比較することにより、切れ目の絆意志等しく、あなたはXを除外カスタムkey機能を使用していることを無効にできます。

>>> [i[2] for i in sorted(zip(Z, Y, X), key=lambda x: (x[0], x[1]))] 
['d', 'h', 'b', 'i', 'f', 'a', 'c', 'e', 'g'] 
+2

これはおそらく最も単純です。また、ラムダの代わりに 'operator.itemgetter'を使用することもできます。 – miradulo

+0

@Mitchそれは正しいです、 'key = operator.itemgetter(0、1)'も動作します。 'itemgetter'が複数の引数を受け入れることをしばしば忘れてしまいます。 – MSeifert

+0

私も!または、スライスを受け付けることさえできます。 – miradulo

関連する問題