AJW*_*AJW 14 python python-2.7
我是python的新手,我正在努力形成多个列表的组合.所以,我有三个(可能更多)看起来像这样:
uk_rock_stars=[1,2,3,4,5,6,7,8,9]
uk_pop_stars=[10,11,12,13,1,4,6,22,81]
us_stars=[22,34,44,7,33,99,22,77,99]
.
.
Run Code Online (Sandbox Code Playgroud)
所有相同长度的列表.现在,我想生成它们的组合列表,其中N是上面列表的总数.我正在寻找一个看起来像这样的结果:
comb=[(1,10,22),(1,10,34),(1,10,44)...etc (all combinations)....]
Run Code Online (Sandbox Code Playgroud)
这样,每个组合,比如说(1,10,22)与原始列表的数量相同(在这种情况下为3)
mar*_*ega 22
阅读这篇http://docs.python.org/2/library/itertools.html#itertools.product,它解释了一切.
itertools是一个包,它具有一堆用于迭代集合的有用功能.一个有用的功能是product创建一个生成器的函数,该生成器将迭代您提供的任意数量可迭代集合的笛卡尔积.
结果itertools.product不是列表,它是一个生成器.python生成器类似于其他语言的协同程序.这意味着它将根据需要计算您的组合.如果计算三个迭代的乘积,每个迭代的大小为100,但只使用前10个左右,itertools.product则只计算10个组合,而不是计算所有100 ^ 3组合.
如果你真的想要一个列表对象而不是一个生成器(也许你想要计算切片或其他东西)调用该list函数并将你的生成器对象作为参数传递.
以下代码生成所有组合并打印结果.
码:
import itertools
uk_rock_stars=[1,2,3,4,5,6,7,8,9]
uk_pop_stars=[10,11,12,13,1,4,6,22,81]
us_stars=[22,34,44,7,33,99,22,77,99]
for combination in itertools.product(uk_rock_stars, uk_pop_stars, us_stars):
print combination
Run Code Online (Sandbox Code Playgroud)
输出:
(1, 10, 22)
(1, 10, 34)
(1, 10, 44)
(1, 10, 7)
(1, 10, 33)
(1, 10, 99)
(1, 10, 22)
(1, 10, 77)
(1, 10, 99)
(1, 11, 22)
(1, 11, 34)
(1, 11, 44)
(1, 11, 7)
(1, 11, 33)
(1, 11, 99)
(1, 11, 22)
(1, 11, 77)
(1, 11, 99)
...
etc.
Run Code Online (Sandbox Code Playgroud)
我认为这是您要寻找的:
import itertools
comb = itertools.product(uk_rock_stars, uk_pop_stars, us_stars)
Run Code Online (Sandbox Code Playgroud)
它会为您提供一个迭代器对象,它可能不是您想要的。要将其转换为普通列表,只需使用以下命令:
comb = list(comb)
Run Code Online (Sandbox Code Playgroud)