按键分组字典并找到最大值

Group dictionary by key and find max value

我有一个以日期时间为键、ID 列表为值的字典。它实际上是一天中每个时间段的活跃用户数。

字典看起来像:

2016-03-09 12:13:24 [34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L, 35167L, 35180L]
2016-03-09 12:16:49 [34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L, 35167L, 35187L]
2016-03-09 12:17:14 [34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L, 35167L, 35187L]
2016-03-09 12:21:39 [34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L, 35167L]
2016-03-09 12:22:01 [34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L, 35188L]
2016-03-09 12:23:08 [34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L, 35188L]
2016-03-09 12:23:37 [35191L, 34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L]
2016-03-09 12:24:05 [35191L, 34941L, 34943L, 35183L, 35028L, 35031L, 35081L, 35091L]

我想做的是制作一个包含每天最大用户数的字典。类似于:

2016-03-07: 25
2016-03-08: 38
2016-03-09: 12
2016-03-10: 29

编辑:我想找到每一天的峰值。

所以我需要找到值列表的长度,然后按键的日期分组,最后找到组的最大值。

查找列表的长度是比较容易的部分,例如:

for time, user_id in sorted(users_by_time.iteritems()):
    user_by_time[time] = len(user_id)

但我正在为分组而苦苦挣扎。

如何以最 effective/pythonic 的方式同时进行分组和最大计算?

对于分组你可以做

from collections import defaultdict
output = defaultdict(int)
for key, value in my_dict:
    b[key.date()] += len(value)

然后转换为列表并排序

output = sorted(zip(output.keys(), output.values()))

获取每一天的峰值非常容易:

from collections import defaultdict

max_count_by_day = defaultdict(int)
for dt, user_ids in users_by_time.iteritems():
    d = dt.date()
    max_count_by_day[d] = max(max_count_by_day[d], len(user_ids))

对于每天不同用户的数量,使用 defaultdict(set):

users_in_day = defaultdict(set)
for dt, user_ids in users_by_time.iteritems():
    users_in_day[dt.date()].update(user_ids)

然后将字典展平成另一个date: count:

usercount_per_day = {d: len(user_ids) for d, user_ids in users_in_day.iteritems()}