如何以Pythonic的方式获取两个等长列表间的所有元组排列组合
如何以Pythonic的方式获取两个等长列表间的所有元组排列组合
我现在有两个长度相同的列表,想找一种Pythonic的写法,生成一个嵌套列表——里面每个子列表都是由n个元组构成的,而且每个子列表都是两个列表元素间的一种独特排列组合。举个实际的例子:
给定:
a = [1, 2] b = [3, 4]期望得到的输出是:
[ [(1, 3), (2, 4)], [(1, 4), (2, 3)] ]
我之前查过类似的问题,但都不是我要的效果;也翻了itertools标准库,一开始没找到合适的工具,想问问有没有优雅的Python写法来解决这个问题?
优雅的解决方案
其实用itertools.permutations就能完美解决你的需求,思路特别直接:对第二个列表生成所有可能的排列,然后把每个排列和第一个列表的元素逐一配对成元组,再把这些元组打包成列表即可。
直接上代码:
import itertools a = [1, 2] b = [3, 4] # 列表推导式+permutations+zip的组合,简洁又高效 result = [list(zip(a, perm)) for perm in itertools.permutations(b)] print(result)
运行这段代码就能得到你想要的输出:
[[(1, 3), (2, 4)], [(1, 4), (2, 3)]]
为什么这是Pythonic的?
- 用了列表推导式:这是Python里处理这类“生成新列表”场景的经典写法,简洁易读,完全贴合Python追求的“优雅”风格
- 复用标准库工具:
itertools.permutations是专门用来生成可迭代对象全排列的工具,不用自己手动实现排列逻辑,既避免重复造轮子,又保证了代码的执行效率 - 搭配
zip函数:zip是Python里用来将多个可迭代对象元素一一配对的常用工具,在这里正好用来把a的元素和b的每个排列元素精准配对成元组
这个方法还能适配更长的列表,比如当n=3时:
a = [1, 2, 3] b = [4, 5, 6] result = [list(zip(a, perm)) for perm in itertools.permutations(b)] # 结果会包含6个不同的嵌套子列表,每个都是唯一的元组排列组合
备注:内容来源于stack exchange,提问作者Jeffrey Van Laethem
相关产品推荐
相关产品推荐

