【发布时间】:2017-10-22 14:59:12
【问题描述】:
完整代码:
cp1=[1,2,3,4,5,6]
cp1=[1,2,3,4,5,6]
cn1=[7,8,9,10,11,12]
cn2=[13,14,15,16,17,18]
cn3=[19,20,21,22,23,24]
cn4=[25,26,27,28,29,30]
import itertools
sets = [cp1,cn1];
ks = [3,2]
for i in itertools.product(*[itertools.combinations(set, k) for set, k in zip(sets, ks)]):
a = i[0]+i[1]
for i in itertools.permutations(a) :
i_sum1 = i[0] + i[1]
i_sum2 = i_sum1 + i[2]
i_sum3 = i_sum2 + i[3]
i_sum4 = i_sum3 + i[4]
i2_sum1 = i[1] + i[2]
i2_sum2 = i2_sum1 + i[3]
i2_sum3 = i2_sum2 + i[4]
i3_sum1 = i[2] + i[3]
i3_sum2 = i3_sum1 + i[4]
i4_sum1 = i[3] + i[4]
allsum =(i_sum1, i_sum2,i_sum3,i_sum4, i2_sum1, i2_sum2, i2_sum3, i3_sum1,i3_sum2,i4_sum1)
if (i_sum1 or i_sum2 or i_sum3 or i_sum4 or i2_sum1 or i2_sum2 or i2_sum3 or i3_sum1 or i3_sum2 or i4_sum1) not in (cn1 or cn2 or cn3) :
for b in itertools.product(cn4, repeat=2):
if (b[0] and b[1]) in allsum :
print (i,allsum)
解释:
-
随机列表
cp1=[1,2,3,4,5,6] cn1=[7,8,9,10,11,12] cn2=[13,14,15,16,17,18] cn3=[19,20,21,22,23,24] cn4=[25,26,27,28,29,30] -
两个列表之间的组合,每个结果使用一个的 3 个元素和另一个的 2 个元素
import itertools sets = [cp1,cn1]; ks = [3,2] for i in itertools.product(*[itertools.combinations(set, k) for set, k in zip(sets, ks)]): -
合并结果
a = i[0]+i[1] -
结果的排列
for i in itertools.permutations(a) : -
特定的排列总和
i_sum1 = i[0] + i[1] i_sum2 = i_sum1 + i[2] i_sum3 = i_sum2 + i[3] i_sum4 = i_sum3 + i[4] i2_sum1 = i[1] + i[2] i2_sum2 = i2_sum1 + i[3] i2_sum3 = i2_sum2 + i[4] i3_sum1 = i[2] + i[3] i3_sum2 = i3_sum1 + i[4] i4_sum1 = i[3] + i[4] allsum =(i_sum1, i_sum2,i_sum3,i_sum4, i2_sum1, i2_sum2, i2_sum3, i3_sum1,i3_sum2,i4_sum1)仅打印特定结果:
-
如果其中任何一个总和在任何列表 cn1、cn2 或 cn3 中,则避免该结果: (这是我遇到问题的地方)
if (i_sum1 or i_sum2 or i_sum3 or i_sum4 or i2_sum1 or i2_sum2 or i2_sum3 or i3_sum1 or i3_sum2 or i4_sum1) not in (cn1 or cn2 or cn3) : -
仅打印包含某个列表 cn4 的 2 个元素的剩余结果 (和此处)
for b in itertools.product(cn4, repeat=2): if (b[0] and b[1]) in allsum : print (i,allsum)
输出:
第一个结果是(1, 2, 3, 7, 12) (3, 6, 13, 25, 5, 12, 24, 10, 22, 19)
它表明 6 和 7 部分不起作用。 6ª 应该阻止它,因为它包含 (13,12,24,22,19),cn1、cn2 和 cn3 的元素。而 7ª 应该阻止它,因为它不包含 cn4 的两个元素,而只有一个,“25”。
【问题讨论】:
-
欢迎来到 SO。请花时间阅读How to Ask 及其包含的链接。将问题浓缩为minimal reproducible example 的任何机会 - 使用 fake 数据来说明这一点是可以的。您的情况不清楚:如果有
in (cn1 or cn2 or cn3),您是否要排除所有这些项目?或者如果它们是in (cn1 or cn2 or cn3),您是否要排除个别项目? -
是的,如果这些条目中的任何一个在这些列表中的任何一个 (cn1,cn2,cn3) 中,则应该避免包含它的整个结果。感谢您的建议,我会在下一篇文章中阅读它
标签: python if-statement combinations permutation itertools