2012-01-28 4 views
2

병합 나는 두 목록파이썬 : 두 개의 목록

list1= [6, 1, 8, 1, 2] 
    list2= ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"] 

이 난 내가 그들에게 DICT를 변환하는 시도했지만 중복 값을 허용하지 않습니다 먼저

(14,"mailopened") (4,"mailnotopened") 

같은 노력의 결과로했다. 두 번째 목록에 따라이 목록을 추가 할 수 있습니다.

+0

(위 참조), 목록은 각괄호 '[]'로 표시된다. 괄호는 보통 튜플과 함께 사용됩니다. – voithos

+0

내 사과, 내 질문에 정정했다. – shobhit

답변

7

defaultdict을 사용하고 간단히 list1의 값을 추가하십시오.

from collections import defaultdict 

list1 = [6, 1, 8, 1, 2] 
list2 = ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"] 

added = defaultdict(int) 

for i, k in enumerate(list2): 
    added[k] += list1[i] 

defaultdict 존재하지 않는 키에 액세스 할 경우 기본값을 제공하기 때문에이 작동합니다. 이 경우 0이 기본값 인 int으로 지정되었으므로 기본값을 제공합니다.

@GaretJax에서 enumerate() 도난 사용. :)

+0

당신은 나에게 달렸어 ... 너무 느리다. – GaretJax

+1

고마워. .... 완벽하게 작동했다. – shobhit

4
dict_out = dict() 
for list1_val, k in zip(list1, list2): 
    dict_out[k] = dict_out.get(k, 0) + list1_val 

출력 :

In [10]: dict_out 
Out[10]: {'not open': 4, 'open': 14} 

설명 :

  1. zip(list1, list2) 시퀀스 (6, 'open'), (1, 'not open'), ..., (2, 'not open') 동일하다. 사전 dict_out를 들어

  2. , dict_out.get(k, 0) 반환 dict_out[k]을 존재하는 경우는 true, 그렇지 않은 경우는 0.

  3. 따라서 for 루프는 다섯 (값, 키) 쌍을 반복하고 사전 dict_out에 누적합니다.

+1

이전에 보지 못했던'dict.get()'의 좋은 사용법입니다. 감사! – voithos

+0

나는 그것을 시험해 보았지만 항상 나에게 주었다. AttributeError : '긴'객체에는 'get'속성이 없다. – shobhit

+0

죄송합니다. 'dict_out [k] = ... '여야합니다. 편집을 참조하십시오. –

2
from collections import defaultdict 

list1 = [6, 1, 8, 1, 2] 
list2 = ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"] 

d = defaultdict(lambda:0) 

for i, k in enumerate(list2): 
    d[k]+=list1[i] 

print d 
print d.items() 

편집 : voitos 빠르게 동일한 용액이었다 파이썬

+0

Hehe, nice. 나는 당신이'int'를 지정하는 대신'lambda'를 사용하는 것을 알아 챘습니다. 아마'int'는 약간 더 좋은 성능을 가질 것입니까? 그리고 다시,'enumerate()'는 아마도'zip()'보다 빠를 것입니다. – voithos

+0

enumerate는 분명히 더 많은 메모리를 효율적으로 사용합니다 ... ;-) int를 전혀 사용하지 않을 생각이었습니다 ... 다음에 기억할 것입니다! – GaretJax

+0

Btw @voithos, 자유롭게'enumerate'를 사용하여 답을 편집하십시오; 유사한 문제가있는 다음 하나가'zip'을 사용하는 이유는 없습니다 ;-) – GaretJax