基于三个列表生成所有可能的元组
有趣的回答,让我来修改一下问题。
在对代码进行了一些修改后,我得到了这个:
#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)
注意:这个代码只有在“东西”没有重复的时候才有效。