46

リストがあります:

a = [("ax", 1), ("ec", 3), ("bk", 5)]

別のリスト:

b = ["ec", "ax", "bk"]

a次のように並べ替えたいb

sort_it(a, b)

a = [("ec", 3), ("ax", 1), ("bk", 5)]

これを行う方法?

4

4 に答える 4

67
a.sort(key=lambda x: b.index(x[0]))

これは、ソートする値として各タプルの最初の要素のaインデックスを使用してインプレースでソートします。ba

別の、おそらくよりクリーンな書き方は次のようになります。

a.sort(key=lambda (x,y): b.index(x))

アイテムの数が多い場合は、少し異なる方法で処理する方が効率的です。これ.index()は、長いリストではコストのかかる操作になる可能性があり、順序がわかっているため、実際には完全な並べ替えを行う必要がないためです。

mapping = dict(a)
a[:] = [(x,mapping[x]) for x in b]

これは、2タプルのリストに対してのみ機能することに注意してください。任意の長さのタプルで機能させたい場合は、少し変更する必要があります。

mapping = dict((x[0], x[1:]) for x in a)
a[:] = [(x,) + mapping[x] for x in b]
于 2012-10-10T08:04:08.150 に答える
2

もう1つの可能性はa、ソート、インデックスbに従ってソートし、インデックスに従ってbソートすることですa

a.sort(key=lambda x: x[0])
ind = [i[0] for i in sorted(enumerate(b),key=lambda x: x[1])]
a = [i[0] for i in sorted(zip(a,ind),key=lambda x: x[1])]

すべての並べ替えには n*log(n) がかかるため、これはより大きなリストに対してもスケーラブルです

于 2016-04-24T19:54:33.480 に答える
0

従来の並べ替えは必要ない場合があります。

[tup for lbl in b for tup in a if tup[0] == lbl]
# [('ec', 3), ('ax', 1), ('bk', 5)]
于 2017-09-29T06:51:25.200 に答える