2016-03-10 2 views
1

У меня есть словарь с datetime как ключ и список идентификаторов в качестве значения. На самом деле это количество активных пользователей за каждое время дня.Групповой словарь по ключу и найти максимальное значение

Словарь выглядит следующим образом:

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 

EDIT: Я хочу найти пик каждого дня.

Поэтому мне нужно найти длину списка значений, а затем группировать по дате ключа и, наконец, найти максимальное значение группы.

Нахождение длины списка является легкой частью что-то вроде:

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

Но я борюсь с группировкой.

Как можно выполнить как групповое, так и максимальное вычисление и в идеале наиболее эффективным/питоническим способом?

+1

Клавиша ввод Словарь являются datetime.datetime объектов? или строки? –

+0

@MuhammadTahir, они являются объектами datetime.datetime. – Galil

+4

Было бы полезно, если бы вы разместили свой 'dict' в синтаксисе' dict', чтобы пользователи могли скопировать и вставить его напрямую :) –

ответ

4

Чтобы получить пики каждый день довольно легко:

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()} 
-1

Для группирования можно сделать

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())) 
+0

Я не знаю, если просто добавление длин - хорошая идея, потому что, если один и тот же пользователь посещает в разное время в тот же день? Мы хотим, чтобы '34943L' считался шестью пользователями, потому что он посетил шесть раз? – Kevin

+0

@ Кевин да! Прости! забыли это :) –

+0

@ Ответ Антти более важен в этом случае. –

Смежные вопросы