2017-10-16 66 views
-6

我有下面的字典格式,我想總結基於日期的字典值。如何在python中總結基於日期的字典值?

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

字典到列表轉換有什麼用?這不僅非常不直觀,而且還依賴於字典中鍵的迭代順序,這取決於字典的類型,甚至可能在Python實現上。 –

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不是一本字典,它是一個字典表。僅使用標準庫來嘗試以下腳本。

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

以上答案非常好。我在Python中很新,我有一個非常天真的方式。如果你不想導入模塊:

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