如何编写通用代码按特定顺序合并两个等长列表?
通用实现两个等长列表的元素组合拼接
现有两个等长列表List_A与List_B,当列表长度为3时,可通过多层嵌套循环按特定顺序合并元素并输出组合结果(示例代码及输出如下)。现需编写通用代码,实现对任意长度n的两个等长列表,完成上述嵌套循环的合并输出效果。尝试过itertools相关函数未成功,推测可能与递归算法有关。
示例代码(长度为3时)
List_A = ['abc', 'def', 'ghi'] List_B = ['123', '456', '789'] for i in [List_A[0], List_B[0]]: for j in [List_A[1], List_B[1]]: for k in [List_A[2], List_B[2]]: print(i+j+k)
示例输出
abcdefghi abcdef789 abc456ghi abc456789 123defghi 123def789 123456ghi 123456789
解法1:用itertools.product实现(更简洁高效)
你之前尝试itertools没成功,大概率是没找对用法。其实itertools.product正好能生成这种笛卡尔积组合,完全不需要递归。核心思路是先把两个列表对应位置的元素配对,再生成所有可能的组合:
import itertools List_A = ['abc', 'def', 'ghi'] List_B = ['123', '456', '789'] # 先生成每一组可选元素:比如第一个位置选List_A[0]或List_B[0],以此类推 choices = [[a, b] for a, b in zip(List_A, List_B)] # 生成所有组合,逐个拼接输出 for combo in itertools.product(*choices): print(''.join(combo))
运行这段代码就能得到和示例完全一致的输出,而且支持任意长度的等长列表。
解法2:递归实现
如果一定要用递归,思路是逐层处理每个位置的可选元素,逐步拼接结果,直到处理完所有位置再输出:
List_A = ['abc', 'def', 'ghi'] List_B = ['123', '456', '789'] def generate_combinations(a_list, b_list, current_str='', idx=0): # 递归终止条件:所有位置都处理完了,输出结果 if idx == len(a_list): print(current_str) return # 选当前位置a列表的元素,继续递归下一个位置 generate_combinations(a_list, b_list, current_str + a_list[idx], idx + 1) # 选当前位置b列表的元素,继续递归下一个位置 generate_combinations(a_list, b_list, current_str + b_list[idx], idx + 1) generate_combinations(List_A, List_B)
这段递归代码的逻辑和多层嵌套循环完全等价,每一层递归对应一层循环,逐个位置选择A或B的元素,最终生成所有组合。
内容的提问来源于stack exchange,提问作者Fabricio Brum
相关产品推荐
相关产品推荐

