Python,按另一个列表对列表进行排序

dli*_*dli 7 python python-2.7

我有一个清单a

a = ['c','d','b','a','e']
Run Code Online (Sandbox Code Playgroud)

和一个列表b

b = ['a001','b002','c003','d004','e005']
Run Code Online (Sandbox Code Playgroud)

我怎么能得到我的列表c如下:

c = ['c003','d004','b002','a001','e005']
Run Code Online (Sandbox Code Playgroud)

基本上b使用每个元素的一部分,按照 中定义的顺序进行排序a

非常感谢。

rec*_*ive 7

您可以使用以下key命名参数来完成此操作sorted()

c = sorted(b, key = lambda e: a.index(e[0]))
Run Code Online (Sandbox Code Playgroud)


nne*_*neo 6

如果您有一个非常大的列表,则使用的解决方案.index将不会非常有效,因为第一个列表将index针对第二个列表中的每个条目。这将花费 O(n^2) 时间。

相反,您可以构造一个排序映射:

order = {v:i for i,v in enumerate(a)}
c = sorted(b, key=lambda x: order[x[0]])
Run Code Online (Sandbox Code Playgroud)

  • @njzk2:为​​每个元素计算一次 IIRC `key` 并存储。这与 `cmp` 参数形成对比,每次比较都会评估一次。 (3认同)

Chr*_*ian 5

您可以尝试将lambda函数传递给内置函数key的参数:sorted()

a = ['c', 'd', 'B', 'a', 'e']
b = ['a001', 'B002', 'c003', 'd004', 'e005']
c = sorted(b, key = lambda x: a.index(x[0])) # ['c003', 'd004', 'b002', 'a001', 'e005']
Run Code Online (Sandbox Code Playgroud)

  • 这是一个坏主意。`index` 将对 `a` 执行 _O(N)_ 搜索,从而产生 `O(N² log N)` 排序。 (2认同)