/ / Combinaisons sans éléments répétés en Python - python, combinaisons, itertools

Combinaisons sans éléments répétés en Python - python, combinaisons, outils informatiques

Le code Itertool.combination me donne toutes les combinaisons pour une valeur cible J'ai un tableau

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

Je reçois de la sortie:

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é. Rendement requis: - [(2, -2)] #As 2, -2 paires sont associées à 0. Le code ne doit plus utiliser 2 pour additionner: 1,1,2 et net ce qui est désactivé avec -4. [Je ne veux pas que les chiffres soient répétés une fois qu'il est utilisé dans l'une des paires.]

# 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

Réponses:

0 pour la réponse № 1

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

Les 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)]
>>>

MODIFIER: C’est parce que l’op a changé d’intention en raison de sa décision ultérieure. commentaire

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