【问题标题】:Python - Increasing combinations of two listsPython - 增加两个列表的组合
【发布时间】:2022-11-03 01:55:03
【问题描述】:

我正在尝试创建两个列表的组合。如果您愿意,列表 A 应该会增加,或者是一个滑动窗口。列表 B 是静态的。其中列表 A 可以有任意数量的值。

我的问题似乎与我看到的已经发布的不同,因为我在一个列表上使用滑动窗口并保持另一个列表静态,所以它不像两个列表的每个组合那么简单。

所以输入看起来如下所示:

ListA = [Val1, Val2, Val3]
ListB = [0, 1]

给出以下输出:

[Val1, 0]
[Val1, 1]
[Val2, 0]
[Val2, 1]
[Val3, 0]
[Val3, 1]

[[Val1, 0], [Val2, 0]]
[[Val1, 0], [Val2, 1]]
[[Val1, 1], [Val2, 0]]
[[Val1, 1], [Val2, 1]]

[[Val1, 0], [Val3, 0]]
[[Val1, 0], [Val3, 1]]
[[Val1, 1], [Val3, 0]]
[[Val1, 1], [Val3, 1]]

[[Val2, 0], [Val3, 0]]
[[Val2, 0], [Val3, 1]]
[[Val2, 1], [Val3, 0]]
[[Val2, 1], [Val3, 1]]

[[Val1, 0], [Val2, 0], [Val3, 0]]
[[Val1, 0], [Val2, 0], [Val3, 1]]
[[Val1, 0], [Val2, 1], [Val3, 0]]
[[Val1, 0], [Val2, 1], [Val3, 1]]
[[Val1, 1], [Val2, 0], [Val3, 0]]
[[Val1, 1], [Val2, 0], [Val3, 1]]
[[Val1, 1], [Val2, 1], [Val3, 0]]
[[Val1, 1], [Val2, 1], [Val3, 1]]

我已经尝试了一段时间的 itertools 组合和产品,我无法理解它。 Covid脑雾:D。任何帮助,将不胜感激。

谢谢

【问题讨论】:

    标签: python list combinations sliding-window


    【解决方案1】:

    理解这种不断增加的组合很复杂,但一旦你理解了它,你就会觉得很容易

    让我帮你理解这背后的逻辑

    from itertools import combinations
    
    listA = ["Val1", "Val2", "Val3"]
    listB = [0, 1]
    
    def perm(l, k):
        n, p = l
        res = l
        prev_gen = (i for i in res)
        for i in range(1, k+1):
            res = (f'{j}{i}' for i in prev_gen for j in (n, p))
            prev_gen = res
        return res
    
    # 3C1 * 2 + 3C2 * 2^2 + 3C3*2^3
    for idx, _ in enumerate(listA, 1):
        for j in combinations(listA, idx):
            for k in perm(listB, idx-1):
                print(list(zip(j, map(int, str(k)))))
    

    这是生成所有可能组合的代码。 我试图理解这背后的模式,我在这个中找到了以下模式

    如果len(list1) = 3len(list2) = 2 然后看起来像

    3C1*2^1 + 3C2*2^2 + 3C3 * 2^3

    因此,通过这种方法,我尝试构建组合。

    【讨论】:

      【解决方案2】:

      我想有一种更清洁的方法可以做到这一点,但这很有效。

      from itertools import chain, combinations, product
      
      A = ['v1', 'v2', 'v3']
      B = [0, 1]
      
      for i in chain.from_iterable(combinations(A, k+1) for k in range(len(A))):   
          print([list(zip(i,j)) for j in product(B,repeat=len(i))])
      
      print()
      

      在 for 循环中,我们遍历 A 的幂集(不包括空集)。所以 (v1), (v2), (v3), (v1,v2), (v1,v3), (v2,v3), (v1,v2,v3)。

      product(B,repeat=len(i)) 是 len(i) 的 B 的元素的所有排列。因此,如果 i = (v1,v2),我们将得到 ((0,0),(0,1),(1,0),(1,1))。

      最后,遍历这些排列并用 i 压缩每个排列。对 powerset 的所有元素重复此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 2017-10-26
        • 2017-09-04
        相关资源
        最近更新 更多