2017-04-14 9 views
3

사전의 튜플 목록에서 값 조합을 합산하려고합니다. 예를 들어, 내 사전에는 다음이 포함되어 있습니다.파이썬은 조합을 사용하여 사전의 목록에있는 튜플의 값을 합산합니까?

dict = {1: [(2, 2), (4, 3), (6, 1), (7, 1), (8, 3)], 2: [(4, 1), (5, 3), (1, 2)],...} 

여러 항목이 포함되어 있습니다. 나는 그래서 항목 1 (4)의 최대 합계 많은 조합의 각 항목에 대한 튜플의 두 번째 값을 요약하기 위해 노력하고있어, 원하는 출력은 다음과 같습니다

{1: [(2, 6, 3), (2, 7, 3), (4, 6, 4), (4, 7, 4), (6, 7, 2), (8, 6, 4), (8, 7, 4)] 

을 어디에서 세 번째 값 이 튜플은 이전 튜플의 두 번째 값의 조합의 합계이며이 튜플의 첫 번째 및 두 번째 값은 이전 튜플의 연관된 첫 번째 값입니다.

나는 다음과 같은 코드를 시도 :

for key, value in dict.items(): 
    object1 = key 
    mylist = value 
    for tup in mylist: 
     object2 = tup[0] 
     pair = tup[1] 
     combo = itertools.combinations(tup[1],2) 
     sum = {k:sum(j for _,j in v) for k,v in combo} 
     if sum <= 4: 
      print(sum) 

을 그리고 오류

'numpy.float64' object is not iterable 

내 오류 "콤보"와 itertools의 가능성이 내 사용에서 비롯된 생각을 얻는다. 코드의이 섹션을 수정해야 할 것인지 또는 필자의 접근 방식에서 벗어난 것인지 확실하지 않습니다.

+0

나는이 문제를 이해하지 못하는 것 같습니다. 오류는 반복 할 수없는 항목을 반복하는 중입니다. 그러나 코드는 사용자가 입력 한 내용을 표시하지 않습니다. –

+1

'mylist '란 무엇입니까? –

+1

_ "내 오류는"콤보 "에서 유래했다고 생각합니다."_ 추적은 오류가 발생한 행을 나타냅니다. 제발 질문에 관련성이 있다고 생각합니다. –

답변

1

예, itertools.combinations으로 할 수 있지만 올바른 인수를 전달해야합니다. :) 튜플의 쌍을 만들 수 있도록 튜플의 목록을 전달해야합니다. 일 수 있습니다. 기존의 for 루프를 사용하면 쉽게 읽을 수 있습니다.

다른 사람들이 언급했듯이 combinations으로 올바른 것을 전달하지 않는 것 외에는 코드에 다른 문제가 있습니다. 주요한 것은 당신이 sum이라는 이름으로 사전을 할당하고 있다는 것인데, 이것은 또한 당신이 사용하려고 시도하고있는 sum 내장 함수를 어둡게합니다. 그리고 당신은 또한 그 사전을 정수 4와 비교하려고 시도합니다, 그것은 많은 의미를 가지지 않습니다. :)

어쨌든, 여기에 원하는 코드가 있습니다. 예상 출력에서 ​​마지막 두 튜플 : (8, 6, 4)(8, 7, 4)은 각각 (6, 8, 4)(7, 8, 4)이어야합니다.

from itertools import combinations 

a = { 
    1: [(2, 2), (4, 3), (6, 1), (7, 1), (8, 3)], 
    2: [(4, 1), (5, 3), (1, 2)], 
} 

new_dict = {} 

for k, seq in a.items(): 
    c = [] 
    for (u,v), (x,y) in combinations(seq, 2): 
     total = v + y 
     if total <= 4: 
      c.append((u, x, total)) 
    new_dict[k] = c 

for k, seq in new_dict.items(): 
    print(k, seq) 

출력

1 [(2, 6, 3), (2, 7, 3), (4, 6, 4), (4, 7, 4), (6, 7, 2), (6, 8, 4), (7, 8, 4)] 
2 [(4, 5, 4), (4, 1, 3)] 

combinations(seq, 2)는 튜플의 쌍을 산출하고, 우리는

같은 것을 할 수 있었다 우리

for (u,v), (x,y) in combinations(seq, 2): 

자신의 개인 번호로 튜플을 풀 수

for t0, t1 in combinations(seq, 2): 

다음에 별도의 단계에서 t0t1 튜플을 압축 해제하거나 색인 생성을 사용하여 항목을 가져옵니다. 예 :

for t0, t1 in combinations(seq, 2): 
    total = t0[1] + t1[1] 
    if total <= 4: 
     c.append((t[0], t[1], total)) 

하지만 이전 방법이 덜 어수선하다고 생각합니다.


하지만 당신은 지능형으로 모든 일을 주장하는 경우, 다음을 수행 할 수는 v+y <= 4을 통과하는 모든 조합에 대해 두 번 v+y를 계산하기 때문에이 이전 버전에 비해 덜 효율적이라고

new_dict = {k: [(u, x, v+y) for (u,v), (x,y) in combinations(seq, 2) if v+y <= 4] 
    for k, seq in a.items()} 

주 테스트.