조합

2017-09-19 4 views
-2

Itertool.combination 코드는 나에게 내가 배열을 내가로부터 얻을조합

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

출력이 목표 값 에 대한 모든 조합을 제공합니다

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

을 그러나 관심사입니다 : - 숫자가 사용되면 반복해서는 안됩니다. 필수 출력 : - [(2, -2)] #As 2, -2 페어 그물을 0으로합니다. 코드를 다시 사용하여 합계를 계산하면 안됩니다. [나는 그것이 쌍 중 하나를 사용하면 숫자가 반복 얻을 싶지 않다.]

# 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

확인? – Idos

+0

어떻게하면됩니까? –

+0

출력이 여러 숫자로 나뉘어서 우선 순위가 제한되고 시작 위치가 달라질 수 있으므로이 점은 분명하지 않습니다. – Abra001

답변

0

사용이 :

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

출력 :

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

을 편집 : 이것은 나중에 그의 0123의 미덕으로 자신의 의도를 변경 op 때문입니다 92,348,999,

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

이 이미 사용하는 다른 인덱스의 값을 배제하지 않는다 : 현재 번호가 temp_var` '이고 그 다음 건너 뛸 경우 경우

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