从多个列表中选择组合

23 投票
2 回答
17607 浏览
提问于 2025-04-17 18:28

我刚开始学习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.

撰写回答