2014-01-29 6 views
3

내가의 말을하자, 파이썬 정수의 목록을 가지고 itertools.combinations` 이 정수들. 그래서 3의 정수와 (원하는 출력의 일례를 얻을 - 중량 = [7, 5, 3 : 이들 가중치부분적인 합계는

sums = [ [7], [7+5], [7+3], [7+5+3], [5], [5+3], [3] ] 

연결된 I는 함께리스트의리스트가 다른 배열이라의 luggages를 짐의 이름이 형식의 기자 무게 :

luggages = [["samsonite", 7], ["Berkin", 5], ["Catelli", 3] .....] 

나는이 방법으로 체중라는 배열을 생성

weight = numpy.array([c[1] for c in luggages]) 

나는 짐 이름에 대해이 작업을 수행 할 수 있습니다. 필요합니다. 나는 (제안에) 이런 식으로 itertools.combinations를 사용하려고 :

comb = [combinations(weight, i) for i in range(len(luggages))] 

내 목표 : 모든의 max_weight = 23킬로그램 주어진 내가 여행을 가져올 수있는 수하물 이름의 가능한 모든 부분 집합을 인쇄하려면 부분 집합 합계가 정확히 23KG 인 조건을 만족하는 각 부분 집합의 조합. 간단히 말해서 무게를 합산하면 max_weight = 23 정확히 일치하는 luggages의 이름이있는 목록을 인쇄해야합니다. 마음에 드십시오 : luggages는 각 부분 집합에서 한 번만 선정 될 수 있고 그러나 가능한 한 많은 부분 집합에서 나타날 수있다. 또한 각 하위 집합의 항목 수는 무의미합니다. 합계가 정확히 23 인 경우 수하물 1, 2, 3이 될 수 있습니다.

+0

''당신에게 평평 목록을 제공 [조합 (의 luggages, 난)에서 C의 전 범위에 대한 C (LEN (의 luggages) +1)] 가능한 모든 하위 집합의 하위 집합. 이제 for 루프를 사용하여 반복 할 수 있습니다. 루프 내부에는 현재 하위 집합의 가중치를 더하는 다른 루프가 있습니다. 총 가중치가 일치하면 현재 하위 집합을 다시 반복하여 이름을 출력합니다. 당신은 체중 배열이 정말로 필요하지 않습니다. –

+0

@NiklasB 나는 당신이 무슨 뜻인지 이해했다고 생각하는데, 이것은 많은 도움이되었습니다! 내가 가지고있는 유일한 질문은 모두 C이다. 나는 ..... C 다. 나는 그들이 어떻게 작동하는지 완전히 이해하지 못한다고 생각한다. 내가 그것을 설명 할 수있는 방법은 없을까? 또는 내가 참조 할 수있는 문서? 감사합니다. – user3245453

+0

두 개의 중첩 된'for' 루프가'c' 값을 생성하고리스트의 뒤쪽에 추가되는 것과 같습니다. 다른 질문에 대한 내 의견보기 –

답변

3

여행 판매원에서 근무하고 있습니까? 당신이 사용하는 모든 사용자가 좋아하는 파이썬 기능을 수행 할 수 지능형리스트 :

weight = [7, 5, 3, 2, 9, 1] 

cmb = [] 
for x in range(1, len(weight) + 1): 
    cmb += itertools.combinations(weight, x) 

#cmb now contains all combos, filter out ones over the limit 

limit = 23 

valid_combos = [i for i in cmb if sum(i) == limit] 

print(valid_combos) 
+0

Ahh 그래서 :) 나는 내 의견을 철회! 나는 우리의 대답이 거의 같다고 생각합니다. –

+0

코드를 조금 정리하고 버그를 고쳤습니다. 괜찮습니다. 또한 OP는 가중치가 아닌 이름을 인쇄하려고하지만 다시는 작업을 수행 할 필요가 없습니다. –

+0

전혀 아닙니다!좋은 캐치 :) – BringMyCakeBack