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

Gio*_*ous 6 python

我有两个清单:

a = ['a', 'b']
b = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我想得到列表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"]
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 14

您可以使用itertools.product(..)但指定repeatrepeat=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))
Run Code Online (Sandbox Code Playgroud)

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)]
Run Code Online (Sandbox Code Playgroud)

因此,这里的元组的第一个元素是连接到一个a_,第二个到b_.现在我们将zip(..)它们与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)]]
Run Code Online (Sandbox Code Playgroud)

现在只需要格式化('%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']
Run Code Online (Sandbox Code Playgroud)

请注意,这里的元素是懒惰生成的.如果您仅对第k一个感兴趣,或者您不想一次生成所有这些内容,则此功能非常有用.