我有两个列表:
a = ['a', 'b']
b = [1, 2, 3]
我希望获得列表b
的元素和列表a的元素之间产生的组合,但将a
的元素视为对(或三元组等)。如下面的例子所示,它给出了len(b) ** len(a)
的组合数量。
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种可能的组合。
发布于 2017-03-07 00:42:44
您可以使用itertools.product(..)
,但将repeat
指定为repeat=len(a)
。因此,您可以使用:
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(..)
将生成如下元组:
>>> 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
列表结合在一起,生成:
>>> 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
来生成一个列表)。
您的示例输入的结果为:
>>> 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
对象感兴趣,或者您不想一次生成所有对象,那么这将非常有用。
发布于 2017-03-07 00:54:46
您可以使用itertools.product
显式创建成对项目,然后使用itertools.product
再次对这些成对项目进行操作
import itertools
a = ['a', 'b']
b = [1, 2, 3]
pairs = [list(itertools.product([ai], b)) for ai in a]
pairs
将包含两个可以再次输入到itertools.product
中的列表。
list(itertools.product(*pairs))
结果是:
[(('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))]
https://stackoverflow.com/questions/42630909
复制相似问题