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)]
>>>
Vérifiez si le nombre actuel est 'temp_var' et si elle est sauter alors? – Idos
Comment est-ce que je fais cela? –
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