2017-10-16 1 views
-6

아래의 사전 형식을 사용하고 있습니다. 날짜를 기준으로 사전 값을 합산하려고합니다.파이썬에서 날짜 기반 사전 값을 합하는 방법은 무엇입니까?

dict1 = [ 
      {'date':"10-05-2017", 'cost':20}, 
      {'date':"10-05-2017", 'cost':10}, 
      {'date':"11-05-2017", 'cost':15}, 
      {'date':"11-05-2017", 'cost':10}, 
      {'date':"12-05-2017", 'cost':5} 
     ] 

결과 :

[ 
    {'date':"10-05-2017", 'cost':30}, 
    {'date':"11-05-2017", 'cost':25}, 
    {'date':"12-05-2017", 'cost':5} 
] 
+4

환상적입니다. 이 코드를 보여 주시겠습니까? 그리고 구현시 어려움을 나타낼 수 있습니까? – idjaw

+1

문자열 값이 날짜를 나타내는 것은 사실 관련이 없습니다. – chepner

+0

팬더가 유용 할 수 있습니다. 여기에 익숙하다면 –

답변

2

쉽게 itertools.groupby하여이 작업을 수행 할 수 있습니다 :이 단지 작품을 동일한 날짜에 사전 즉 경우, 서로 인접한 경우 것으로

>>> [{"date": key, "cost": sum(d["cost"] for d in group)} 
... for key, group in itertools.groupby(dict1, key=lambda d: d["date"])] 
[{'cost': 30, 'date': '10-05-2017'}, 
{'cost': 25, 'date': '11-05-2017'}, 
{'cost': 5, 'date': '12-05-2017'}] 

주 확실하지 않은 경우 가장 먼저 같은 key으로 목록을 정렬하십시오.

1

이 시도 :

result = {} 
for i in dict1: 
    result[i['date']] = result.setdefault(i["date"], 0) + i["cost"] 
1

당신이 시도 할 수 있습니다 :

import itertools 
dict1 = [ 
     {'date':"10-05-2017", 'cost':20}, 
     {'date':"10-05-2017", 'cost':10}, 
     {'date':"11-05-2017", 'cost':15}, 
     {'date':"11-05-2017", 'cost':10}, 
     {'date':"12-05-2017", 'cost':5} 
    ] 
new_data = [(a, list(b)) for a, b in itertools.groupby([i.items() for i in dict1], key=lambda x:list(x)[0][1])] 
final_dict = [{"date":a, "cost":sum(list(i)[-1][-1] for i in b if "cost" in list(i)[-1])} for a, b in new_data] 

출력 :

[{'date': '10-05-2017', 'cost': 30}, {'date': '11-05-2017', 'cost': 25}, {'date': '12-05-2017', 'cost': 5}] 
+0

dict-to-list-conversion이란 무엇입니까? 이것은 매우 직관적 일뿐만 아니라 dict의 형식에 의존하는 dict의 키의 반복 순서에 의존하며 파이썬 구현에서도 가능합니다! –

1

당신은 날짜별로 그룹에 기록을 itertools.groupby을 사용할 수 있습니다.

이 함수는 : 날짜를 추출하는 데 사용되는 다른 함수가 필요합니다. 그것에 대해 operator.itemgetter을 사용할 수 있습니다.

import itertools 
import operator 


dict1 = [{'cost': 20, 'date': '10-05-2017'}, 
     {'cost': 10, 'date': '10-05-2017'}, 
     {'cost': 15, 'date': '11-05-2017'}, 
     {'cost': 10, 'date': '11-05-2017'}, 
     {'cost': 5, 'date': '12-05-2017'}] 

get_date = operator.itemgetter('date') 
get_cost = operator.itemgetter('cost') 

result = [{'date': date, 'cost': sum(map(get_cost, group))} 
      for date, group in itertools.groupby(dict1, key=get_date)] 

참고 :dict1이 (사전의 목록입니다) 날짜별로 정렬해야합니다

dict1.sort(key=get_date) 
여기

이 기능과 이해의 목록을 사용하여 짧은 솔루션입니다
1

우선 dict1은 사전이 아니며 사전 목록입니다. standar 라이브러리 만 사용하여 다음 스크립트를 시도하십시오.

from collections import Counter 

dict1 = [ 
    {'date':"10-05-2017", 'cost':20}, 
    {'date':"10-05-2017", 'cost':10}, 
    {'date':"11-05-2017", 'cost':15}, 
    {'date':"11-05-2017", 'cost':10}, 
    {'date':"12-05-2017", 'cost':5} 
] 

counter = Counter() 

for each in dict1: 
    counter.update({each['date']: each['cost']}) 

[{'date': key, 'cost': value} for key, value in counter.items()] 
-1

위의 답변은 매우 좋습니다. 나는 파이썬으로 아주 새롭다, 나는 아주 순진한 방법이있다. 모듈을 가져 오지 않으려는 경우 :

def sum_dict(dict_list): 
    date_dict = {} 
    def iter_dict(one_dict): 
     date_dict[one_dict['date']] = one_dict['cost'] if one_dict['date'] \ 
            not in date_dict else \ 
            date_dict[one_dict['date']] + \ 
            one_dict['cost'] 

    list(map(iter_dict, dict_list)) 

    result_list = list(map(lambda x:{'date': x, 'cost': date_dict[x]}, 
         date_dict)) 
    # print(result_list) 
    return result_list 
관련 문제