获取不同大小输入列表的 N 长度的所有组合

问题描述 投票:0回答:1

我已经看到其他关于使用

itertools
从单个列表甚至列表列表生成组合的问题,但我正在寻找稍微不同的东西。

我有一个不同长度的列表列表(有些是 2 个属性长,有些是 4 个属性长)。我需要能够生成所有列表组合,其中包含来自任何列表的所有元素,总共添加 6 个最终元素。

这是我的源数据-

A = ["A1", "A2", "A3", "A4"]
B = ["B1", "B2"]
C = ["C1", "C2"]
D = ["D1", "D2"]
E = ["E1", "E2"]

all = [A,B,C,D,E]

我的理想(示例)输出是 -

[A1, A2, A3, A4, B1, B2]
[A1, A2, A3, A4, C1, C2]
[A1, A2, A3, A4, D1, D2]
[A1, A2, A3, A4, E1, E2]
[B1, B2, C1, C2, D1, D2]
[B1, B2, C1, C2, E1, E2]
...

itertools
中是否有实用程序允许我执行此操作,或者我是否需要编写自定义循环来实现此操作,如果是这样,实现此操作的正确方法是什么?

python combinations
1个回答
0
投票

您将需要结合 itertools 中的一些工具来完成此操作,但您还需要一些循环才能使事情正常进行。

首先要用伪代码把事情说清楚,你想:

  1. 生成所有可能长度的所有组合(itertools.combinations + for loop)
  2. 连接这些组合(itertools.chain)
  3. 过滤那些组合只包含长度为 6
  4. 的列表

直接翻译成代码是:

ALL_LISTS = [A, B, C, D, E]

LENGTH_6_CHAINS = []
for combination_length in range(2, len(ALL_LISTS)):
    for combination in itertools.combinations(ALL_LISTS, combination_length):
        chain = list(itertools.chain.from_iterable(combination))
        if len(chain) == 6:
            LENGTH_6_CHAINS.append(chain)

如果您希望它可重用或使用不同的可能输出长度,您可以考虑生成器辅助函数:

def build_chains(item_lists):
    for combination_length in range(2, len(item_lists)):
        for combination in itertools.combinations(item_lists, combination_length):
            yield list(itertools.chain.from_iterable(combination))

LENGTH_6_CHAINS = [chain for chain in build_chains(ALL_LISTS) if len(chain) == 6]
© www.soinside.com 2019 - 2024. All rights reserved.