2014-10-23 3 views
1

PHP에서 나에게 아주 간단할만한 문제를 해결해야하지만 파이썬에서 어떻게 처리 할 수 ​​있는지 놓치고 있습니다.사전에 목록 값 병합

가정하자 나는이 다음 사전 :

data = {'year': [], 'week': [], 'value': []} 

모든 목록이 항상 같은 길이있을 것이다 그래서 데이터의 가능한 값은 다음과 같습니다

내가 할 노력하고있어
{'year': ['2014', '2014', '2014'], 'week': ['44', '49', '49'], 'value': [15, 20, 30]} 

:

'주'목록을 반복 할 때 :

· 현재 주 목록의 다음 값과 동일한 값이있는 경우 :

.. 다음 주로 해당 주를 덮어 쓰고 그 다음 연도로 덮어 쓰고 그 값을 주와 동일한 색인으로 합계하십시오.

그래서 것이다 결과 : 내가 얻을 것으로 예상 무엇

{'year': ['2014', '2014'], 'week': ['44', '49'], 'value': [15, 50]} 

나는 시도했다 :

· 순회 사전 이상하지만,하지만, 불쌍한 내 파이썬 지식, for 루프를 만들려고 할 때 object of type 'bool' has no len()과 같은 오류가 발생했습니다. (나는 구조체를 사용했습니다 for i in range len(dictionary.index))

· 체크 아웃 itertoolscollections을 찾았지만, 맞는 것을 찾을 수 없습니다.

단계별로 간단하게 시도 : 사전에서 다른 목록으로 만두를 작성한 다음 하나씩 항목을 비교하고 다른 목록에 값을 저장하는 등의 작업을 단계별로 시도해보십시오.

확인할 아이디어가 있습니까? 및

답변

2

사용 itertools.groupby (떨어져 킵 학습 파이썬에서) 이상 enumerate(d['week']) 반복 :

from itertools import groupby 
from operator import itemgetter 

d = {'year': ['2014', '2014', '2014'], 'week': ['44', '49', '49'], 'value': [15, 20, 30]} 
out = {'year': [], 'week': [], 'value': []} 

for k, g in groupby(enumerate(d['week']), key=itemgetter(1)): 
    total = 0 
    for i, x in g: 
     total += d['value'][i] 
    # Now `i` is the last index of the group and `x` is the last week of the group, 
    # We can use these to get values from 'year' and 'week'. 
    out['year'].append(d['year'][i]) 
    out['week'].append(x) 
    out['value'].append(total) 

print out 
#{'week': ['44', '49'], 'value': [15, 50], 'year': ['2014', '2014']} 
+0

가 환상적인, 내가 체크 아웃'groupby'하지만'enumerate' 내가 인덱스 내에서 그것을 사용하는 방법에 대해 실종 된 일이었다, 다른 것들 중에서 ... 또한, 그것은 'pythonic'달콤한 방법입니다 TFYH – zedee