【问题标题】:Python : Print only the results that are in a specific listPython:仅打印特定列表中的结果
【发布时间】: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)

解释:

  1. 随机列表

    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]
    
  2. 两个列表之间的组合,每个结果使用一个的 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)]):
    
  3. 合并结果

        a = i[0]+i[1]
    
  4. 结果的排列

        for i in itertools.permutations(a) :
    
  5. 特定的排列总和

            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)
    

    仅打印特定结果:

  6. 如果其中任何一个总和在任何列表 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) :
    
  7. 仅打印包含某个列表 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


【解决方案1】:

使用集合来测试成员资格。

q = set(cn1)
q.update(cn2)
q.update(cn3)
# or
##q = set(itertools.chain(cn1, cn2, cn3))
# or
##q = set(n for item in (cn1, cn2, cn3) for n in item)

#fake i_sums
z = [25, 26, 27, 28, 2]
z = set(z)

#for your code
##z = set(i_sum1,  i_sum2, i_sum3, i_sum4, i2_sum1, i2_sum2, i2_sum3, i3_sum1, i3_sum2, i4_sum1)


>>> q.isdisjoint(z)
True
>>> if q.isdisjoint(z):
    print('doit')

doit
>>>

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多