2017-09-19 2 views
-2

Code Itertool.combination me donne toutes les combinaisons pour une valeur cible j'ai un tableaucombinaisons de pas des éléments répétés en Python

a=[1,1,2,-2,-4] target =0 

sortie que je reçois de:

Itertools.combination is: [(2, -2), (1, 1, -2), (1, 1, 2, -4)]. 

Mais le souci est : - Une fois le numéro utilisé, il ne devrait pas être répété. Sortie obligatoire: - [(2, -2)] #As 2, -2 paires de réseaux à 0. Le code ne doit pas utiliser 2 pour additionner: 1,1,2 et net cela avec -4. [Je ne veux pas que le nombre de se répéter une fois qu'il est utilisé dans l'un des deux.]

# Reference code:- 

    import itertools 
    import numpy as np 

    def subset_sum(target, numbers): 

     array_num=np.array(numbers) 
     for size in xrange(1, len(array_num) + 1): 
      for c in itertools.combinations(array_num, size): 
       if sum(c) == target: 
        temp_var.append(c) 
        print "Length of array is ",len(array_num) 

     return temp_var 

    numbers=[1,1,2,-2,-4] 
    target=0 
    output=subset_sum(numbers) 
    print output 
+0

Vérifiez si le nombre actuel est 'temp_var' et si elle est sauter alors? – Idos

+0

Comment est-ce que je fais cela? –

+0

cela n'est pas clair parce que la sortie pourrait être de nombreuses possibilités en fonction de quels numéros sont prioritaires à exclure et par où commencer – Abra001

Répondre

0

Utilisez ceci:

concat = lambda i,j: list(i if type(i) is list else [i])+list(j if type(j) is list else [j]) 
reduce(lambda x,y: x if any([u in j for j in (x if type(x) is list else [x]) for u in y]) else concat(x,y), reduce(lambda x,y: concat(x,y), [[[],filter(lambda x:sum(x)==target,list(itertools.combinations(a,u)))] for u in range(2,len(a)+1)])) 

Sorties:

>>> concat = lambda i,j: list(i if type(i) is list else [i])+list(j if type(j) i 
s list else [j]) 
>>> a=[1,1,2,-2,-4] 
>>> target=0 
>>> reduce(lambda x,y: x if any([u in j for j in (x if type(x) is list else [x]) 
for u in y]) else concat(x,y), reduce(lambda x,y: concat(x,y), [filter(lambda 
x:sum(x)==target,list(itertools.combinations(a,u))) for u in range(2,len(a))])) 
(2, -2) 
>>> a=[5,1,3,-4,-5] 
>>> reduce(lambda x,y: x if any([u in j for j in (x if type(x) is list else [x]) 
for u in y]) else concat(x,y), reduce(lambda x,y: concat(x,y), [filter(lambda 
x:sum(x)==target,list(itertools.combinations(a,u))) for u in range(2,len(a))])) 
[(5, -5), (1, 3, -4)] 
>>> a=[1,-1,2,-2,-4] 
>>> reduce(lambda x,y: x if any([u in j for j in (x if type(x) is list else [x]) 
for u in y]) else concat(x,y), reduce(lambda x,y: concat(x,y), [filter(lambda 
x:sum(x)==target,list(itertools.combinations(a,u))) for u in range(2,len(a))])) 
[(1, -1), (2, -2)] 
>>> 

EDIT: C'est parce que l'op a changé son intention en vertu de sonplus tard

f=lambda x:tuple(map(lambda x:a[x],x)) if type(x)==tuple else map(lambda x:f(x),x) 
f(reduce(lambda x,y: x if any([u in j for j in (x if type(x) is list else [x]) for u in y]) else concat(x,y), reduce(lambda x,y: concat(x,y), [filter(lambda x:sum(f(x))==target,list(itertools.combinations(range(0,len(a)),u))) for u in range(0,len(a)+1)]))) 

Cela n'exclut pas les valeurs déjà utilisées de différents indices:

>>> a=[21197595.75,11885337.56,-11885337.56,-11885337.56,-9312258.19] 
>>> f(reduce(lambda x,y: x if any([u in j for j in (x if type(x) is list else [x 
]) for u in y]) else concat(x,y), reduce(lambda x,y: concat(x,y), concat([filter 
(lambda x:sum(f(x))==target,list(itertools.combinations(range(0,len(a)),u))) for 
u in range(2,len(a)+1)],[])))) 
[(11885337.56, -11885337.56), (21197595.75, -11885337.56, -9312258.19)] 
>>>