从多个列表中选择组合
我刚开始学习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]
.
.
这些列表的长度都是一样的。现在,我想生成一个组合列表,N就是上面提到的列表总数。我希望得到的结果看起来像这样:
comb=[(1,10,22),(1,10,34),(1,10,44)...etc (all combinations)....]
这样,每个组合,比如(1,10,22),的长度和原始列表的数量是一样的(在这个例子中是3)。
2 个回答
5
我觉得这就是你想要的内容:
import itertools
comb = itertools.product(uk_rock_stars, uk_pop_stars, us_stars)
这段代码会给你一个迭代器对象,这个对象可能是你想要的,也可能不是。如果你想把它转换成一个普通的列表,只需要用下面这段代码:
comb = list(comb)
34
你可以看看这个链接 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
输出:
(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.