如何参照另一不同长度列表顺序重排目标列表且保留其余元素位置
列表重排实现方法
需求说明
给定两个列表,需要对第一个列表重排,满足两个规则:
- 同时存在于两个列表中的公共元素,按照第二个列表指定的顺序排列
- 不在第二个列表中的元素,保留在原列表中的位置不变
以题目给出的示例为例:
listA = ['apples','bananas','peaches','orange'] listB = ['peaches','apples']
期望输出:
Result = ['peaches','bananas','apples','orange']
实现思路
- 先提取出按
listB顺序排列、且确实存在于listA中的公共元素,做成迭代器方便按顺序取值 - 遍历原
listA,遍历到公共元素的位置时,从迭代器中按顺序取出对应公共元素替换;遍历到非公共元素时,直接保留原值,保证位置不变
实现代码
基础版本(适合元素无重复的小列表)
listA = ['apples','bananas','peaches','orange'] listB = ['peaches','apples'] # 构造按listB顺序的公共元素迭代器 common_elements = iter([item for item in listB if item in listA]) # 遍历生成结果 result = [next(common_elements) if elem in listB else elem for elem in listA] print(result) # 输出: ['peaches', 'bananas', 'apples', 'orange']
优化版本(适合大列表,查找效率更高)
当列表长度较大时,把列表转成集合做成员判断,时间复杂度从O(n)降到O(1),运行速度更快:
listA = ['apples','bananas','peaches','orange'] listB = ['peaches','apples'] set_a = set(listA) set_b = set(listB) common_elements = iter(item for item in listB if item in set_a) result = [next(common_elements) if elem in set_b else elem for elem in listA]
逻辑说明
- 非公共元素全程没有改动位置,完全保留原列表的相对位置
- 公共元素只会填充到原列表中原本就是公共元素的位置,填充顺序严格遵循
listB的排序 - 自动兼容边界场景:如果
listB包含listA中不存在的元素会自动跳过,如果listB为空则结果和原listA完全一致
注:以上实现默认列表元素为唯一值,如果业务场景存在重复元素,可根据重复个数补全迭代器内的元素,适配对应需求。
内容的提问来源于stack exchange,提问作者user17578315
相关产品推荐
相关产品推荐

