Python 按键对字典进行分组并查找最大值
我有一个字典,datetime是键,ID列表是值。它实际上是一天中每个时间的活动用户数 字典看起来像:Python 按键对字典进行分组并查找最大值,python,dictionary,itertools,Python,Dictionary,Itertools,我有一个字典,datetime是键,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 1
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)
编辑:我想找到每天的高峰
所以我需要找到值列表的长度,然后按键的日期分组,最后找到组的最大值
查找列表的长度是一个简单的部分,如:
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)
但我正在与分组作斗争
如何以最有效的方式进行分组和最大计算?对于分组,您可以这样做
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
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)
:
然后将字典展平为另一个日期:count
:
usercount_per_day = {d: len(user_ids) for d, user_ids in users_in_day.iteritems()}
要达到每天的高峰非常容易:
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)
:
然后将字典展平为另一个日期:count
:
usercount_per_day = {d: len(user_ids) for d, user_ids in users_in_day.iteritems()}
输入dict的键是datetime.datetime对象?还是字符串?@MuhammadTahir,它们是datetime.datetime对象如果你真的用
dict
的语法发布你的dict
,这样用户就可以直接复制和粘贴:)输入dict的键是datetime.datetime对象?还是字符串?@MuhammadTahir,它们是datetime.datetime对象如果你真的用dict
的语法发布你的dict
,这样用户就可以直接复制粘贴:)我不知道把长度加起来是否是个好主意,因为如果同一个用户在同一天的不同时间访问会怎么样?我们希望34943L
因为他访问了六次而算作六个用户吗?@Kevin耶!很抱歉忘了:)@Antti的答案在这种情况下更为有效。我不知道仅仅将长度相加是否是个好主意,因为如果同一用户在同一天的不同时间访问会怎么样?我们希望34943L
因为他访问了六次而算作六个用户吗?@Kevin耶!很抱歉忘了:)@Antti的答案在这种情况下更有效。