我有这个词典列表:
[{'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'的词典,而不是只有一个带有总结事件的词典。原始列表要大得多,我只是用一个简短的版本来更好地解释自己。
随意询问您是否理解我的问题,以便我能更好地解释自己。
答案 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'])
]