Python,按另一个列表排序列表

12

我有一个列表a

a = ['c','d','b','a','e']

以及一个列表b

b = ['a001','b002','c003','d004','e005']

我应该如何让我的列表c变成以下的样子:

c = ['c003','d004','b002','a001','e005']

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

非常感谢。


这与Martijn最初使用的重复问题略有不同 - 我目前正在寻找最佳规范,并已更换为迄今为止找到的最佳结果。 - Karl Knechtel
3个回答

9
如果您有一个非常大的列表,使用.index的解决方案将不会很有效,因为第一个列表将被每个第二个列表中的条目索引。这将花费O(n^2)时间。
相反,您可以构建一个排序映射:
order = {v:i for i,v in enumerate(a)}
c = sorted(b, key=lambda x: order[x[0]])

问题:在排序期间,key被调用了多少次?是n吗?是否有一个由key结果组成的缓存? - njzk2
3
据我所记,对于每个元素,key只计算一次并存储。这与cmp参数不同,后者在每次比较时都会计算一次。 - nneonneo

7

您可以使用 sorted()key 参数来实现:

c = sorted(b, key = lambda e: a.index(e[0]))

1
这是一个不好的想法。index将在a上执行_O(N)_搜索,导致_O(N² log N)_排序。 - Richard
排序通常被称为“O(N log N)”,其中“N”是列表中的元素数量。 这个数字不一定与“a”中的元素数量相同。 如果“a”很小,那么这可能比设置一个字典更快。 如往常一样,使用您的用例数据测试性能。 - recursive

5
您可以尝试将一个lambda函数传递给sorted()内置函数的key参数:
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']

2
这是一个不好的想法。index将在a上执行_O(N)_搜索,导致_O(N² log N)_排序。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接