Python实现:将含单元素/元组的多列表合并为元组列表
问题:合并含单个元素或元组的列表
假设有多个长度相同的列表,元素可以是单个值(字符串、数字)或元组,示例如下:
a = ['AA', 'BB', 'CC'] b = [7,8,9] d = [('TT', 'ZZ'),('UU', 'VV'),('JJ','KK')] e = [('mm', 'nn'), ('bb', 'vv'), ('uu', 'oo')]
需要合并任意数量的这类列表,最终得到元组列表。但原生zip函数无法满足需求,以下写法都得不到预期结果:
# 这些写法均无效: print(list(zip(a,b))) # 仅当所有元素都是单个值时有效,遇到元组会出错 print(list(zip(b,*d))) print(list(zip(*d,*e)))
预期合并结果:
# a与b合并: [('AA', 7), ('BB', 8), ('CC', 9)] # a与d合并: [('AA','TT', 'ZZ'),('BB', 'UU', 'VV'),('CC','JJ','KK')] # d与e合并: [('TT', 'ZZ','mm', 'nn'),('UU', 'VV','bb', 'vv'),('JJ','KK','uu', 'oo')]
核心需求:将每个列表的元素统一视为元组(单个值自动转为单元素元组),再将对应位置的元组元素拼接成一个新元组。
解决方案
通用实现函数
核心逻辑:先把每个元素统一转为元组,再对对应位置的元组进行拼接。以下是两种实现方式:
基础循环版(可读性高)
def merge_lists(*lists): result = [] # 遍历所有列表的对应位置元素组 for items in zip(*lists): merged_tuple = () for item in items: # 单个元素转成单元素元组,元组则直接拼接 merged_tuple += (item,) if not isinstance(item, tuple) else item result.append(merged_tuple) return result
列表推导式版(简洁)
def merge_lists(*lists): return [ tuple(elem for item in items for elem in ((item,) if not isinstance(item, tuple) else item)) for items in zip(*lists) ]
测试验证
# 测试a+b合并 print(merge_lists(a, b)) # 输出:[('AA', 7), ('BB', 8), ('CC', 9)] # 测试a+d合并 print(merge_lists(a, d)) # 输出:[('AA', 'TT', 'ZZ'), ('BB', 'UU', 'VV'), ('CC', 'JJ', 'KK')] # 测试d+e合并 print(merge_lists(d, e)) # 输出:[('TT', 'ZZ', 'mm', 'nn'), ('UU', 'VV', 'bb', 'vv'), ('JJ', 'KK', 'uu', 'oo')] # 支持合并多个列表 print(merge_lists(a, b, d)) # 输出:[('AA', 7, 'TT', 'ZZ'), ('BB', 8, 'UU', 'VV'), ('CC', 9, 'JJ', 'KK')]
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

