そこがリストである:リストを別のリストに従ってソートするには?
a = [("ax", 1), ("ec",3), ("bk", 5)]
別のリスト:
b = ["ec", "ax", "bk"]
私はb
に応じてソートする:これを行うにはどのように
sort_it(a, b)
a = [("ec",3), ("ax", 1), ("bk", 5)]
?
そこがリストである:リストを別のリストに従ってソートするには?
a = [("ax", 1), ("ec",3), ("bk", 5)]
別のリスト:
b = ["ec", "ax", "bk"]
私はb
に応じてソートする:これを行うにはどのように
sort_it(a, b)
a = [("ec",3), ("ax", 1), ("bk", 5)]
?
a.sort(key=lambda x: b.index(x[0]))
これにソート値としてa
から各タプルの最初の要素のb
にインデックスを使用してインプレースa
をソート。
もう一つ、おそらくクリーナー、それを書くの方法は次のようになります。
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]
もう働かが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)をとり、N *ので、これはまだ
伝統ソート大きなリストのためのスケーラブルでは必要とされないことがあります。
[tup for lbl in b for tup in a if tup[0] == lbl]
# [('ec', 3), ('ax', 1), ('bk', 5)]
の可能重複[別のリストからの値に基づいてソートリスト?](http://stackoverflow.com/questions/6618515/sorting-list-based-on-values-from-another-list) – user1251007