如何最简单地合并具有相同值的字典列表?

3
我希望您知道是否有一种简单有效的方法将这个正式的字典格式化为所示的结果?基本上,时间键用于对字典进行分组,变量名称的值用作键,值键用作值。例如,下面是字典列表:
testdata =[{
  'frequency': 'monthly',
  'level': '1',
  'time': '2017 Jan',
  'value': 99.524,
  'variableCode': 'M212191.1',
  'variableName': 'All Items'},
 {'frequency': 'monthly',
  'level': '2',
  'time': '2017 Jan',
  'value': 105.12,
  'variableCode': 'M212191.1.0',
  'variableName': 'Food'},
 {'frequency': 'monthly',
  'level': '1',
  'time': '2017 Feb',
  'value': 99.521,
  'variableCode': 'M212191.1',
  'variableName': 'All Items'},
 {'frequency': 'monthly',
  'level': '2',
  'time': '2017 Feb',
  'value': 105.078,
  'variableCode': 'M212191.1.0',
  'variableName': 'Food'},
]

但我希望它的结果是以下格式:

testdata = [
   {
       'time': '2017 Jan',
       'All Items': 99.524,
       'Food':105.12
   },    
   {
       'time': '2017 Feb',
       'All Items': 99.521,
       'Food':105.078
   },
]

到目前为止,这是我已经取得的进展,但我现在遇到了困难。

import itertools
import operator
import pprint

result = sorted(testdata, key = lambda i: i['time'])
list1 = []

for key, items in itertools.groupby(result, operator.itemgetter('time')):
   list1.append(list(items))

pprint.pprint(list1)

输出:

[[{'frequency': 'monthly',
   'level': '1',
   'time': '2017 Feb',
   'value': 99.521,
   'variableCode': 'M212191.1',
   'variableName': 'All Items'},
  {'frequency': 'monthly',
   'level': '2',
   'time': '2017 Feb',
   'value': 105.078,
   'variableCode': 'M212191.1.0',
   'variableName': 'Food'}],
 [{'frequency': 'monthly',
   'level': '1',
   'time': '2017 Jan',
   'value': 99.524,
   'variableCode': 'M212191.1',
   'variableName': 'All Items'},
  {'frequency': 'monthly',
   'level': '2',
   'time': '2017 Jan',
   'value': 105.12,
   'variableCode': 'M212191.1.0',
   'variableName': 'Food'}]]


1
第一步可能是使用 itertools.groupby - Paul Rooney
1
使用 groupby 会很好,但它假设项目已按 time 排序。这是真的吗? - Mark
是的,它必须按时间排序。 - Shurya Ang
我希望结果按时间排序,同时保持以上所示的结果格式。因此回答您的问题,它尚未排序,需要进行排序。 - Shurya Ang
按照“2017年2月”的格式排序将比实际分组更加费力。您对此格式有任何灵活性吗? - Mark
显示剩余2条评论
2个回答

1
我认为你已经很接近了 - 只需再遍历一次项目。
from itertools import groupby
from operator import itemgetter

d = []

for k, grp in groupby(testdata,key=itemgetter("time")):
    temp = {"time":k}
    for i in grp:
        temp[i.get("variableName")] = i.get("value")
    d.append(temp)

print (d)

结果:

[{'time': '2017 Jan', 'All Items': 99.524, 'Food': 105.12}, {'time': '2017 Feb', 'All Items': 99.521, 'Food': 105.078}]

运行得非常好!谢谢! :) - Shurya Ang

0

使用 itertools.groupby:

import itertools

records = []

def get_dt(x):
    return x['time']

for key, group in itertools.groupby(testdata, get_dt):
    groups = list(group)
    rec = {}
    rec['time'] = key
    rec['All Items'] = sum([x['value'] for x in groups if x['variableName']=='All Items'])
    rec['Food'] = sum([x['value'] for x in groups if x['variableName']=='Food'])
    records.append(rec)

print(records)
# [{'time': '2017 Jan', 'All Items': 99.524, 'Food': 105.12},
#  {'time': '2017 Feb', 'All Items': 99.521, 'Food': 105.078}]

答案来源于此解决方案,来自如何基于字典键的相同值创建列表

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接