dimanche 22 octobre 2017

Python : Print only the results that are in a specific list

Full code:

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)

Explanation:

  1. random lists

    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. combination between 2 lists, using 3 elements of one and 2 of the other one for each result

    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. merging the results

        a = i[0]+i[1]
    
    
  4. permutation of the results

        for i in itertools.permutations(a) :
    
    
  5. specific sum of the permutations

            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)
    
    

    print only especifics results:

  6. avoid the the result if it sum are in the lists, cn1, cn2, or cn3: (here is where I'm having problems)

            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. Print only the remain results that contain 2 elements of a certain list, cn4 (and here)

            for b in itertools.product(cn4, repeat=2):
                if (b[0] and b[1]) in allsum :
                    print (i,allsum)
    
    

Output:

the first result is (1, 2, 3, 7, 12) (3, 6, 13, 25, 5, 12, 24, 10, 22, 19) it shows that the 6, and the 7 parts are not working. 6ª should prevent it because it contain (13,12,24,22,19),elements of cn1, cn2 and cn3. And 7ª should prevent it because it do not contain two elements of cn4, but only one, "25".

Aucun commentaire:

Enregistrer un commentaire