基于三个列表生成所有可能的元组

1 投票
1 回答
623 浏览
提问于 2025-04-18 18:55

有趣的回答,让我来修改一下问题。

在对代码进行了一些修改后,我得到了这个:

#coding:utf-8

import itertools


stuff = [1, 2, 3, 4, 5, 8, 10, 13, 16, 17, 18, 20, 21, 22, 25]
for L in range(5, 6):
    for subset in itertools.combinations(stuff, L):
        subset = list(subset)
        subset.extend([7, 9, 11, 15, 19, 23, 6, 12, 14, 24])
        print(subset)

它的输出结果是这样的:

[1, 2, 3, 4, 5, 7, 9, 11, 15, 19, 23, 6, 12, 14, 24]
[1, 2, 3, 4, 8, 7, 9, 11, 15, 19, 23, 6, 12, 14, 24]
...

大约生成了3000行。

它对列表中的五个数字进行了所有可能的组合,并将另一个列表的内容添加到每一个组合中(subset.extend([7, 9, 11, 15, 19, 23, 6, 12, 14, 24]))。看起来是对的,但我不太确定。

不过我真正想要的是:

1 - 输入三个列表(成对和不成对的)。

stuff = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
pair = [2 , 6, 12, 20, 16, 10, 22]
unpair = [1, 5, 11, 19, 23, 25, 13, 17]

2 - 然后程序会从成对的7个数字中生成所有4个数字的组合,并对不成对的8个数字做同样的事情,生成所有4个数字的组合,最后把它们结合起来,生成一个包含8个数字的列表,所有可能的4个数字组合来自成对和不成对,比如:

[2, 12, 20, 10, 1, 5, 19, 23]
[2, 12, 20, 10, 5, 19, 25, 13]
...

3 - 然后对于成对和不成对生成的每一行组合,它会用列表中的7个数字组合来填充,生成一个包含15个数字的列表,且不重复数字,比如:

[2, 12, 20, 10, 1, 5, 19, 23, 25, 3, 4, 8, 17, 21, 22]
[2, 12, 20, 10, 5, 19, 25, 13, 3, 4, 8, 17, 21, 22, 11]
...

在这里我遇到了困难。如何为每个列表生成组合,并将它们结合起来,生成一个不重复数字和顺序的15个数字的列表。

1 个回答

0

你可以在你的循环里手动写出这个逻辑:

for combo in itertools.combinations(stuff, 15):
    if set(combo).issuperset(pair) and set(combo).issuperset(unpair):
        print(combo)

注意:这个代码只有在“东西”没有重复的时候才有效。

撰写回答