【问题标题】:Sum the values that have the same key in a dictionary对字典中具有相同键的值求和
【发布时间】:2016-05-25 11:49:14
【问题描述】:

我有这个字典列表:

[{'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'}]

对于同一小时内发生的每个事件,我需要将“总事件”的值转换为 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']) ]

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

如果您不理解我的问题,请随时提出,以便我更好地解释自己。

【问题讨论】:

  • 为使groupby 正常工作,mydata 应按用于分组的相同键排序!
  • 所以我需要对 mydata 进行排序?
  • 是的,我会发布一个例子。

标签: python list python-2.7 dictionary


【解决方案1】:

在大多数情况下(如您的情况),如果数据按分组键排序,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 为您节省了一些资源。

【讨论】:

    【解决方案2】:

    这应该可行:(为时已晚;))

     [
       {'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'])
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2020-08-23
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多