【问题标题】:Combinations of two lists (not element-wise) [duplicate]两个列表的组合(不是元素)[重复]
【发布时间】:2017-07-26 15:14:04
【问题描述】:

我有两个列表:

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 种可能的组合。

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用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_ 的。现在我们将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)]]
    

    现在只需要格式化 ('%s_%s'%t) 和 ' '.join(..)ining 它们在一起和 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 感兴趣,或者不想一次生成所有这些,这将很有用。

    【讨论】:

      【解决方案2】:

      您可以使用 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))]
      

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 2015-05-25
        • 1970-01-01
        • 2023-02-19
        • 2018-11-03
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多