【问题标题】:How to get all mappings between two lists?如何获取两个列表之间的所有映射?
【发布时间】:2014-04-14 10:42:25
【问题描述】:

我们有两个列表,A 和 B:

A = ['a','b','c']
B = [1, 2]

有没有一种 Python 的方法来构建 A 和 B 之间包含 2^n(这里 2^3=8)的所有映射集?那就是:

[(a,1), (b,1), (c,1)]
[(a,1), (b,1), (c,2)]
[(a,1), (b,2), (c,1)]
[(a,1), (b,2), (c,2)]
[(a,2), (b,1), (c,1)]
[(a,2), (b,1), (c,2)]
[(a,2), (b,2), (c,1)]
[(a,2), (b,2), (c,2)]

使用itertools.product,可以获得所有的元组:

import itertools as it
P = it.product(A, B)
[p for p in P]

这给出了:

Out[3]: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)]

【问题讨论】:

    标签: python list combinatorics itertools


    【解决方案1】:

    您可以使用 itertools.productzip 执行此操作

    from itertools import product
    print [zip(A, item) for item in product(B, repeat=len(A))]
    

    输出

    [[('a', 1), ('b', 1), ('c', 1)],
     [('a', 1), ('b', 1), ('c', 2)],
     [('a', 1), ('b', 2), ('c', 1)],
     [('a', 1), ('b', 2), ('c', 2)],
     [('a', 2), ('b', 1), ('c', 1)],
     [('a', 2), ('b', 1), ('c', 2)],
     [('a', 2), ('b', 2), ('c', 1)],
     [('a', 2), ('b', 2), ('c', 2)]]
    

    product(B, repeat=len(A)) 产生

    [(1, 1, 1),
     (1, 1, 2),
     (1, 2, 1),
     (1, 2, 2),
     (2, 1, 1),
     (2, 1, 2),
     (2, 2, 1),
     (2, 2, 2)]
    

    然后我们从产品中挑选每个元素并使用A 压缩它,以获得您想要的输出。

    【讨论】:

      【解决方案2】:
      import itertools as it
      
      A = ['a','b','c']
      B = [1, 2]
      
      for i in it.product(*([B]*len(A))):
          print(list(zip(A, i)))
      

      输出:

      [('a', 1), ('b', 1), ('c', 1)]
      [('a', 1), ('b', 1), ('c', 2)]
      [('a', 1), ('b', 2), ('c', 1)]
      [('a', 1), ('b', 2), ('c', 2)]
      [('a', 2), ('b', 1), ('c', 1)]
      [('a', 2), ('b', 1), ('c', 2)]
      [('a', 2), ('b', 2), ('c', 1)]
      [('a', 2), ('b', 2), ('c', 2)]
      

      不确定它是否非常pythonic,如果你看it.product(*([B]*len(A))),因为它使用了多种python特定的语言特性。但它实际上太神秘了,无法成为 Pythonic... B 根据 A 的长度重复 n 次并解包到产品函数中。

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 2022-11-15
        • 2012-10-10
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2023-03-21
        • 2022-01-06
        • 1970-01-01
        相关资源
        最近更新 更多