宝慕林4294392
实际上,有一种方法可以在线性O(n)时间中执行此操作,因为这实际上不是排序操作。列表的存在b意味着排序已经完成;我们真正需要做的就是重新排列元素的a顺序。多亏了词典,这可以有效地完成。from collections import defaultdictdef sorted_by(seq_to_sort, desired_order, key=None): if key is None: key = lambda x: x # group the elements by their key grouped_items = defaultdict(list) for item in seq_to_sort: k = key(item) grouped_items[k].append(item) # flatten the dict of groups to a list return [item for key in desired_order for item in grouped_items[key]]用法:a = [("ax", 1), ("ec", 3), ("bk", 5)]b = ["ec", "ax", "bk"]result = sorted_by(a, b, lambda tup: tup[0])print(result) # output: [("ec", 3), ("ax", 1), ("bk", 5)]笔记:这是一个稳定的排序;如果两个列表项具有相同的键,则将保留其顺序。例:>>> sorted_by([1, 2, 3], [5], key=lambda x: 5)[1, 2, 3]如果有任何列表元素映射到中不存在的键,则desired_order这些元素将被静默丢弃。例如:>>> sorted_by([1, 2, 3], [1, 2, 3], key=lambda x: 5)[]也可以看看:defaultdict