如何依据某一列表的元素顺序,对另一不同长度的列表重新排序?
解决按另一个列表顺序重排列表的问题
核心逻辑
要实现需求,需要:
- 为第一个列表(
a)的元素建立优先级映射,用元素的索引作为排序权重,这样能快速获取元素在a中的顺序位置 - 对第二个列表(
b)排序时:- 若元素存在于
a中,使用它在a的索引作为排序键 - 若元素不存在于
a中,给它一个比a所有元素索引都大的权重(比如len(a)),让这类元素统一排在后面,同时保持它们在b中的原有相对顺序
- 若元素存在于
代码实现
# 示例1 a = ['a', 'b', 'e', 'z', 'f'] b = ['a', 'f', 'b', 'z', 'g', 'h'] # 构建优先级字典:元素 -> 在a中的索引 priority = {elem: idx for idx, elem in enumerate(a)} # 按优先级排序,不在a中的元素用len(a)作为键,排在最后 sorted_b = sorted(b, key=lambda x: priority.get(x, len(a))) print(sorted_b) # 输出: ['a', 'b', 'z', 'f', 'g', 'h'] # 示例2 a = ['a', 'c', 'j', 'r' , 'p'] b = ['b', 'c', 'a'] priority = {elem: idx for idx, elem in enumerate(a)} sorted_b = sorted(b, key=lambda x: priority.get(x, len(a))) print(sorted_b) # 输出: ['a', 'c', 'b']
为什么你之前的代码不行?
你尝试的[x for y, x in sorted(zip(a, b))]有两个问题:
zip(a, b)会自动截断到两个列表中较短的长度,导致较长列表的元素直接丢失- 该逻辑是将
a和b的元素一一配对后排序,完全不符合“按a的顺序重排b”的需求
内容的提问来源于stack exchange,提问作者J Do
相关产品推荐
相关产品推荐

