Python中优雅合并列表元素对:剩余单元素并入前一对
如何优雅地将列表内元素两两合并(剩余单个并入前一对)?
问题描述
给定以下输入列表:
list_to_transform = [['Start', 'двигаться', 'конгресс', 'сша'], ['Start', 'двигаться', 'сторона', 'в'], ['Start', 'двигаться', 'сторона', 'признание', 'суверенитет', 'израильский'], ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'на'], ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'оккупировать'], ['Start', 'двигаться', 'сторона', 'признание', 'высот', 'Голанский'], ['Start', 'двигаться', 'сторона', 'признание', 'и']]
需要将每个子列表中的元素每两个合并为一个字符串;如果子列表元素个数为奇数,剩余的单个元素需要并入前一对合并后的字符串中,最终得到如下结果:
result =[['Start двигаться', 'конгресс сша'], ['Start двигаться', 'сторона в'], ['Start двигаться', 'сторона признание', 'суверенитет израильский'], ['Start двигаться', 'сторона признание', 'высот на'], ['Start двигаться', 'сторона признание', 'высот оккупировать'], ['Start двигаться', 'сторона признание', 'высот Голанский'], ['Start двигаться', 'сторона признание и']]
优雅实现方案
这里提供两种简洁的Python实现方式,核心思路都是先完成两两配对合并,再处理奇数长度的特殊情况:
方案1:利用切片与Zip配对(最简洁)
通过列表切片分离出偶数位和奇数位的元素,再用zip配对合并;最后判断子列表长度是否为奇数,若是则把最后一个元素追加到最后一个合并结果中:
def merge_pairs(sublist): # 两两配对合并:取第0、2、4...个元素和第1、3、5...个元素配对 merged_pairs = [f"{a} {b}" for a, b in zip(sublist[::2], sublist[1::2])] # 处理奇数长度的情况:剩余单个元素并入最后一对 if len(sublist) % 2 != 0: merged_pairs[-1] += f" {sublist[-1]}" return merged_pairs # 应用到整个列表 result = [merge_pairs(lst) for lst in list_to_transform]
方案2:步长循环遍历
通过range设置步长为2遍历子列表,逐个处理元素对;遇到最后一个单个元素时,直接追加到前一个合并结果:
def merge_pairs(sublist): merged = [] # 步长为2遍历,每次处理一对元素 for i in range(0, len(sublist), 2): if i + 1 < len(sublist): merged.append(f"{sublist[i]} {sublist[i+1]}") else: # 剩余单个元素,合并到前一个结果 merged[-1] = f"{merged[-1]} {sublist[i]}" return merged result = [merge_pairs(lst) for lst in list_to_transform]
验证结果
运行上述代码后,得到的result完全符合你的需求。两种方案都很直观且高效,其中方案1的代码更简洁,利用Python的切片和zip特性,可读性也很强。
内容的提问来源于stack exchange,提问作者Alex Nikitin
相关产品推荐
相关产品推荐

