首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >两个列表的组合(不是元素方式)

两个列表的组合(不是元素方式)
EN

Stack Overflow用户
提问于 2017-03-07 00:38:48
回答 2查看 952关注 0票数 6

我有两个列表:

代码语言:javascript
复制
a = ['a', 'b']
b = [1, 2, 3]

我希望获得列表b的元素和列表a的元素之间产生的组合,但将a的元素视为对(或三元组等)。如下面的例子所示,它给出了len(b) ** len(a)的组合数量。

代码语言:javascript
复制
c = ["a_1 b_1", "a_1 b_2", "a_1 b_3", "a_2 b_1", "a_2 b_2", "a_2 b_3", "a_3 b_1", "a_3 b_2" "a_3 b_3"]

我曾尝试使用itertools.product (如here所述),但这将只给出6种可能的组合。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-07 00:42:44

您可以使用itertools.product(..),但将repeat指定为repeat=len(a)。因此,您可以使用:

代码语言:javascript
复制
from itertools import product

def mul_product(a,b):
    for tup in product(b,repeat=len(a)):
        yield ' '.join('%s_%s'%t for t in zip(a,tup))

product(..)将生成如下元组:

代码语言:javascript
复制
>>> list(product(b,repeat=len(a)))
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

这里,元组的第一个元素是附加到a_的元素,第二个元素是附加到b_的元素。现在,我们将它们与a列表结合在一起,生成:

代码语言:javascript
复制
>>> list(map(lambda bi:list(zip(a,bi)),product(b,repeat=len(a))))
[[('a', 1), ('b', 1)], [('a', 1), ('b', 2)], [('a', 1), ('b', 3)], [('a', 2), ('b', 1)], [('a', 2), ('b', 2)], [('a', 2), ('b', 3)], [('a', 3), ('b', 1)], [('a', 3), ('b', 2)], [('a', 3), ('b', 3)]]

现在只需要格式化('%s_%s'%t),然后将它们组合在一起并理解它们(或者您也可以使用' '.join(..) yield来生成一个列表)。

您的示例输入的结果为:

代码语言:javascript
复制
>>> list(mul_product(a,b))
['a_1 b_1', 'a_1 b_2', 'a_1 b_3', 'a_2 b_1', 'a_2 b_2', 'a_2 b_3', 'a_3 b_1', 'a_3 b_2', 'a_3 b_3']

请注意,这里的元素是延迟生成的。例如,如果您只对第一个k对象感兴趣,或者您不想一次生成所有对象,那么这将非常有用。

票数 14
EN

Stack Overflow用户

发布于 2017-03-07 00:54:46

您可以使用itertools.product显式创建成对项目,然后使用itertools.product再次对这些成对项目进行操作

代码语言:javascript
复制
import itertools
a = ['a', 'b']
b = [1, 2, 3]
pairs = [list(itertools.product([ai], b)) for ai in a]

pairs将包含两个可以再次输入到itertools.product中的列表。

代码语言:javascript
复制
list(itertools.product(*pairs))

结果是:

代码语言:javascript
复制
[(('a', 1), ('b', 1)),
 (('a', 1), ('b', 2)),
 (('a', 1), ('b', 3)),
 (('a', 2), ('b', 1)),
 (('a', 2), ('b', 2)),
 (('a', 2), ('b', 3)),
 (('a', 3), ('b', 1)),
 (('a', 3), ('b', 2)),
 (('a', 3), ('b', 3))]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42630909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档