Python如何合并含相似元素的列表并尽可能保留原有顺序
Python相似有序列表合并实现
实现逻辑
完全贴合需求的合并规则,采用双指针遍历方案:
- 双指针分别标记两个列表的当前遍历位置,首先匹配连续的开头公共元素,直接加入结果集
- 公共前缀匹配结束后,若两个指针都未遍历完列表:
- 若当前两个指针指向的元素相等,仅添加一次到结果集,两个指针同步后移
- 若元素不相等,将两个元素紧邻加入结果集,两个指针各后移一位
- 其中一个列表遍历完成后,直接将另一个列表的剩余元素全部追加到结果末尾
代码实现
def merge_similar_lists(list_a, list_b, priority="a"): i = j = 0 merged = [] len_a, len_b = len(list_a), len(list_b) # 匹配开头公共前缀 while i < len_a and j < len_b and list_a[i] == list_b[j]: merged.append(list_a[i]) i += 1 j += 1 # 处理不匹配部分 while i < len_a and j < len_b: if list_a[i] == list_b[j]: merged.append(list_a[i]) i += 1 j += 1 else: # 按优先级决定插入顺序 if priority == "a": merged.append(list_a[i]) merged.append(list_b[j]) else: merged.append(list_b[j]) merged.append(list_a[i]) i += 1 j += 1 # 追加剩余元素 merged.extend(list_a[i:]) merged.extend(list_b[j:]) return merged # 测试用例 list1 = [1,2,3,4,6,7,8,9] list2 = [1,2,3,4,5,8,10] # 优先list1顺序,得到第一种结果 print(merge_similar_lists(list1, list2, priority="a")) # 输出:[1, 2, 3, 4, 6, 5, 7, 8, 9, 10] # 优先list2顺序 print(merge_similar_lists(list1, list2, priority="b")) # 输出:[1, 2, 3, 4, 5, 6, 8, 7, 10, 9]
补充说明
需求中给出的第二种合法结果是不匹配元素插入顺序调整后的合法输出,规则仅要求不匹配元素紧邻放置,未限制二者的先后顺序,两种输出都符合规则要求。
内容的提问来源于stack exchange,提问作者45th Percentile
相关产品推荐
相关产品推荐

