如何根据另一个列表对列表进行排序?

alw*_*btc 40 python sorting list

有一个清单:

a = [("ax", 1), ("ec", 3), ("bk", 5)]
Run Code Online (Sandbox Code Playgroud)

另一个清单:

b = ["ec", "ax", "bk"]
Run Code Online (Sandbox Code Playgroud)

我想按照以下方式排序a:

sort_it(a, b)

a = [("ec", 3), ("ax", 1), ("bk", 5)]
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

Amb*_*ber 60

a.sort(key=lambda x: b.index(x[0]))
Run Code Online (Sandbox Code Playgroud)

a使用b每个元组的第一个元素的索引in a作为其排序的值进行就地排序.

另一种可能更清晰的写作方式是:

a.sort(key=lambda (x,y): b.index(x))
Run Code Online (Sandbox Code Playgroud)

如果你有大量的项目,那么做一些事情可能会更有效率,因为.index()在长列表中可能是一项昂贵的操作,而且你实际上并不需要进行完整的排序,因为你已经知道了这个顺序:

mapping = dict(a)
a[:] = [(x,mapping[x]) for x in b]
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于2元组列表.如果你想让它适用于任意长度的元组,你需要稍微修改它:

mapping = dict((x[0], x[1:]) for x in a)
a[:] = [(x,) + mapping[x] for x in b]
Run Code Online (Sandbox Code Playgroud)