2013-04-11 47 views
-1

我在下面的表格数据中的最大值:发现在2D字典WRT的关键

key, time_bin, count 
abc, 1, 200 
abc, 2,230 
abc1,1,300 
abc1,2,180 
abc2,1, 300 
abc2,2, 800 

所以每个按键都具有相同数量的time_bin的..

我想找到以下.. 对于每个时间箱,这是基于计数的前n个键。

因此,在上面的例子..让我说我想找出..什么是每个时间段的前2个键? So..answer is

1=> [{"abc1",300},{"abc2":300}] 
2=> ({"abc2":800},{"abc":230}] 

什么是解决这个问题的好方法?

+2

不应该是'2 =>({“abc2”:800},{“abc”:230}]'? – unutbu 2013-04-11 21:23:26

+0

@unutbu:那肯定是我得到的.. – 2013-04-11 21:25:04

+0

我会将它移动到DB,在这里你可以很容易地按time_bin进行分组,按照计数Desc排序,limit/top n ... – evgenyl 2013-04-11 21:26:46

回答

3

使用collections.Countercollections.defaultdict

from collections import Counter, defaultdict 
import csv 

counts = defaultdict(Counter) 

with open(somefilename, 'rb') as f: 
    reader = csv.reader(f) 
    next(reader) # skip the header 
    for row in reader: 
     key, time_bin, count = row[0], int(row[1]), int(row[2]) 
     counts[time_bin][key] += count 

for time_bin in counts: 
    print '{}=> {}'.format(time_bin, counts[time_bin].most_common(2)) 

Counter.most_common()方法具体是在这里有帮助的;它会返回给定计数集的最高计数,这里是按时间间隔收集的。

输出格式几乎匹配您的例子:

1=> [('abc1', 300), ('abc2', 300)] 
2=> [('abc2', 800), ('abc', 230)] 

因为.most_common()返回元组,而不是词典列表。

+0

我通常在这里使用'DictReader',例如'reader = csv.DictReader (f,skipinitialspace = True)'[[]]'count [row ['time_bin']] [row ['key']] + = int(row ['count'])''。 – DSM 2013-04-11 21:31:45