对字典中具有相同键的值求和

时间:2016-05-25 11:49:14

标签: python list python-2.7 dictionary

我有这个词典列表:

[{'Total Incidents': '1', 'CrimeTime': '19'}, 
 {'Total Incidents': '1', 'CrimeTime': '19'}, 
 {'Total Incidents': '1', 'CrimeTime': '19'}, 
 {'Total Incidents': '1', 'CrimeTime': '20'}, 
 {'Total Incidents': '1', 'CrimeTime': '20'},
 {'Total Incidents': '1', 'CrimeTime': '21'},
 {'Total Incidents': '1', 'CrimeTime': '21'}]

我需要转换' Total Incidents'对于int,并对它们进行总结,对于在同一小时内发生的每个事件(分钟和秒都无关紧要)。输出应该是这样的:

[{'Total Incidents': 3, 'CrimeTime': '19'},
 {'Total Incidents': 2, 'CrimeTime': '20'},
 {'Total Incidents': 2, 'CrimeTime': '21'}]

我使用过这种方法:

 [{ 'CrimeTime':       g[0], 
    'Total Incidents': sum(map(lambda x: int(x['Total Incidents']), g[1])) } 
  for g in itertools.groupby(mydata, lambda x: x['CrimeTime']) ]

但不幸的是,有时它会重复“犯罪时间”。所以我得到了两个带有相同' CrimeTime'的词典,而不是只有一个带有总结事件的词典。原始列表要大得多,我只是用一个简短的版本来更好地解释自己。

随意询问您是否理解我的问题,以便我能更好地解释自己。

2 个答案:

答案 0 :(得分:3)

在大多数情况下(如在您的情况下),如果数据按分组键排序,itertools.groupby效果最佳,因为它只对相邻元素进行分组:

key = lambda x: x['CrimeTime']
[
    {'CrimeTime': k, 'Total Incidents': sum(int(x['Total Incidents']) for x in g)} 
    for k, g in itertools.groupby(sorted(mydata, key=key), key=key)
]

使用生成器表达式代替map - lambda主要是品味问题,但至少在Python 2中,通过不构建中间list来节省一些资源

答案 1 :(得分:1)

这应该有效:(太晚了;))

 [
   {'CrimeTime': g[0], 'Total Incidents': sum(map(lambda x: int(x['Total Incidents']), g[1]))} 
      for g in 
        itertools.groupby(
          sorted(data,key=lambda x:x.values()[0]), lambda x: x['CrimeTime'])
]