2016-03-10 101 views
1

我有一個字典與日期時間作爲關鍵和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) 

但我與分組掙扎。

分組和最大計算如何完成並理想地以最有效/ pythonic的方式進行?

+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

@ Antti的答案在這種情況下更有效。 –