2017-11-08 2 views
1

길이가 다른 3 개의 목록이 있습니다. 그들은 다음과 같이 만들어집니다 :이 같은 final_list를 얻기 위해 원하는 것은파이썬에서 다른 길이의 합계 목록

final_list = [[1230, 0], [1231,0],[1232,0], [1233, 0], [1234, 0]] 

list2 = [[1232, 20], [1233, 30]] 
list3 = [[1230, 10], [1231,20],[1232,40]] 

:리스트 2와 목록 3의 각 요소를 고려, 자사의 첫 번째 값 중 하나와 동일한 경우

final_list = [[1230, 10], [1231,20],[1232,60], [1233, 30], [1234, 0]] 

(최종 목록의 첫 번째 요소이면 최종 목록의 해당 요소는 발견 된 요소의 합계와 같은 두 번째 값을 가져야합니다.)

+3

추가], 정렬, 그룹, 추가 할 수 있습니다. –

+2

또한 사전을 대신 사용하고 싶을 수도 있습니다. – user3080953

답변

0

깨끗한 해결책은 아니지만 이해하기 쉽고 하루를 절약 할 수 있습니다. 그러나

f = {} 
dcts = map(lambda l: dict([l]), list2+list3) 
for dct in dcts: 
    for k in dct.iterkeys(): 
     f[k] = w.get(k, 0) + d[k] 
final_list = map(list, f.items()) 

, 당신은 itertools

import groupby from itertools 

merged = list2+list3 
final_list = [] 

for key, group in groupby(merged, key = lambda e: e[0]): 
    final_list.append([key, sum(j for i, j in group)]) 

또는 oneliner을 잘 알고있는 경우는

[[k, sum(j for i, j in g)] for k, g in groupby(list3+list2, key = lambda e: e[0])] 
0

나는 temp_list를 생성하고 여기에 세 가지 목록을 추가합니다. dic 사전을 만들고 temp_list을 반복하여 키의 각 튜플 기반을 합산합니다. 그런 다음 dic을 목록으로 다시 정렬합니다.

나는 이것을하는 것이 가장 효율적인 방법이 아니라는 것을 인정합니다. 그러나 그것은 해결책입니다.

temp_list = [] 
temp_list.append(final_list) 
temp_list.append(list2) 
temp_list.append(list3) 

dic = {} 

for lst in temp_list: 
    for tp in lst: 
     if tp[0] in dic: 
      dic[tp[0]] = dic[tp[0]] + tp[1] 
     else: 
      dic[tp[0]] = tp[1] 

result = [] 

for key, value in dic.iteritems(): 
    temp = [key,value] 
    result.append(temp) 

result.sort() 

결과 :

[(1230, 10), (1231, 20), (1232, 60), (1233, 30), (1234, 0)]