基于标记符合并两个仅含'x'和'o'的列表的最优Python实现方式
基于标记符合并两个仅含'x'和'o'的列表的最优Python实现方式
看起来你需要的是把两个列表按标记'o'对齐合并,核心是让两个列表里的'o'序列一一对应,中间和前后的'x'部分保留最长的那一段对吧?我刚好想到一个非常简洁的Pythonic实现方式,亲测完全贴合你的需求!
实现思路
其实我们可以利用字符串的split和join特性来快速搞定:
- 先把两个列表转换成字符串(毕竟每个元素都是单个字符,直接用
''.join()就行) - 用'o'作为分隔符,把两个字符串拆分成片段列表——这些片段就是'o'之间的'x'串(包括开头和结尾的空串)
- 对两个片段列表的对应位置,取长度更长的那个片段(这样就能自动保留最多的'x',完美匹配你例子里的合并逻辑)
- 最后用'o'把这些选好的片段连接起来,再转成列表就搞定了
另外考虑到两个列表里'o'的数量可能不一样的情况,我们用itertools.zip_longest来处理,避免截断短的那个片段列表。
代码实现
from itertools import zip_longest def merge_lists(list1, list2): # 将列表转成字符串,方便后续拆分 str1 = ''.join(list1) str2 = ''.join(list2) # 以'o'为分隔符拆分字符串,得到各个x片段 parts1 = str1.split('o') parts2 = str2.split('o') # 对应位置取最长的片段,不足的补空串 merged_parts = [] for part_a, part_b in zip_longest(parts1, parts2, fillvalue=''): merged_parts.append(max(part_a, part_b, key=len)) # 用'o'连接片段,再转回列表 merged_str = 'o'.join(merged_parts) return list(merged_str)
测试你的例子
第一个例子:
list1 = ['x', 'x', 'o', 'o', 'x', 'x'] list2 = ['o', 'x', 'o'] print(merge_lists(list1, list2)) # 输出: ['x', 'x', 'o', 'x', 'o', 'x', 'x']
第二个例子:
list1 = ['x', 'x', 'o', 'o', 'x', 'x'] list2 = ['x', 'x', 'x', 'o', 'x', 'o'] print(merge_lists(list1, list2)) # 输出: ['x', 'x', 'x', 'o', 'x', 'o', 'x', 'x']
为什么这个方法很Pythonic?
- 用字符串操作替代手动遍历列表,代码简洁又高效,Python就是擅长这种抽象化的处理
max(..., key=len)直接表达了“取最长片段”的逻辑,可读性拉满- 用
zip_longest兼容了'o'数量不同的场景,鲁棒性更强 - 整体逻辑清晰,几行代码就搞定需求,完全符合Python“简洁优雅”的风格
备注:内容来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

