简体   繁体   中英

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) 

    printing only specific results:

  6. avoid the the result if any of it sums are in any of 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".

Use sets to test for membership.

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
>>>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM