如何将列表的列表传入期望*iterables的函数以计算笛卡尔积?
解决itertools.product处理列表的列表的问题
这个场景我之前也碰到过,其实核心就是利用Python的参数解包技巧就能搞定!当你把多个子列表存到一个大列表里时,直接传入product会被当作单个参数处理,这时候只需要用***运算符**来解包这个大列表就行。
具体实现步骤
只需要在传入列表vs的时候加上*,把里面的每个子列表拆解成独立参数传给product:
import itertools v1=['a','b','c'] v2=['1','2'] v3=['x','y','z'] # 把所有子列表存入一个大列表 vs = [v1, v2, v3] # 用*解包vs,让每个子列表作为独立参数传入product result = list(itertools.product(*vs)) print(result)
运行这段代码后,就能得到你预期的笛卡尔积结果:
[('a', '1', 'x'), ('a', '1', 'y'), ('a', '1', 'z'), ('a', '2', 'x'), ('a', '2', 'y'), ('a', '2', 'z'), ('b', '1', 'x'), ('b', '1', 'y'), ('b', '1', 'z'), ('b', '2', 'x'), ('b', '2', 'y'), ('b', '2', 'z'), ('c', '1', 'x'), ('c', '1', 'y'), ('c', '1', 'z'), ('c', '2', 'x'), ('c', '2', 'y'), ('c', '2', 'z')]
原理说明
*在这里是可迭代对象解包运算符,它会把vs里的每个元素(也就是你的子列表v1、v2、v3)分别作为单独的参数传递给product函数,效果和你直接写itertools.product(v1, v2, v3)完全一致。哪怕你的子列表数量是动态变化的(比如从外部读取、用户生成的),这种方法也能完美适配,不用关心具体有多少个子列表。
内容的提问来源于stack exchange,提问作者mhwombat
相关产品推荐
相关产品推荐

