我有以下数据文件。
[{'timeSlot': '10:45 AM','key': 'value', 'key': 'value', 'key': 'value'},{'timeSlot': '10:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '09:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '09:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '10:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '09:45 AM','key': 'value', 'key': 'value', 'key': 'value'}]
我想按时间段分组得到结果。执行此操作的最佳方法是什么?
期望的输出是这样的:
{'09:45 AM' : [{'timeSlot': '09:45 AM', 'key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '09:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '09:45 AM','key': 'value', 'key': 'value', 'key': 'value'}],
'10:45 AM' : [{'timeSlot': '10:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '10:45 AM','key': 'value', 'key': 'value', 'key': 'value'}, {'timeSlot': '10:45 AM','key': 'value', 'key': 'value', 'key': 'value'}]}
请您参考如下方法:
groupby在 itertools 中发挥作用是你想要的:
from itertools import groupby
# assuming `data` is your datafile contents
keyfunc = lambda d: d['timeSlot']
dict((k, list(v)) for k, v in groupby((sorted(data, key=keyfunc)), keyfunc))
调用 sorted 是必要的,否则每次键更改时 groupby 都会返回一个新组。首先对其进行排序类似于调用 sort | bash 终端上的 uniq。
此外,请注意 groupby 默认返回一个带有键和子迭代器的可迭代对象,因此我插入了 dict 和 list 调用将其展平为您想要的结果结构。如果您只需要遍历组,使用迭代器会更简洁、更高效。
