我已经看到其他关于使用
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
中是否有实用程序允许我执行此操作,或者我是否需要编写自定义循环来实现此操作,如果是这样,实现此操作的正确方法是什么?
您将需要结合 itertools 中的一些工具来完成此操作,但您还需要一些循环才能使事情正常进行。
首先要用伪代码把事情说清楚,你想:
直接翻译成代码是:
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]