2010-08-05 93 views
4

我得到了以下词典:总结阵列的字典在Python

mydict = { 
    'foo': [1,19,2,3,24,52,2,6],   # sum: 109 
    'bar': [50,5,9,7,66,3,2,44],   # sum: 186 
    'another': [1,2,3,4,5,6,7,8],   # sum: 36 
    'entry': [0,0,0,2,99,4,33,55],  # sum: 193 
    'onemore': [21,22,23,24,25,26,27,28] # sum: 196 
} 

我需要有效地过滤出并通过阵列的总和的前x条目进行排序。

例如,前3名排序过滤列表上面的例子是

sorted_filtered_dict = { 
    'onemore': [21,22,23,24,25,26,27,28], # sum: 196 
    'entry': [0,0,0,2,99,4,33,55],  # sum: 193 
    'bar': [50,5,9,7,66,3,2,44]   # sum: 186 
} 

我是相当新的Python和尝试过自己与链接之和过滤功能在lambda函数上,但与实际的语法挣扎。

回答

7

这很容易用一种做:

sorted(mydict.iteritems(), key=lambda tup: sum(tup[1]), reverse=True)[:3] 

这是合理的,如果该比率与此类似(3/5)。如果它更大,你会想避免排序(O(n log n)),因为前3可以在O(n)中完成。例如,使用heapq,堆模块:

heapq.nlargest(3, mydict.iteritems(), key=lambda tup: sum(tup[1])) 

这是O(n + 3 log n)的,因为组件中的初始堆为O(n),并重新heapifying是O(log n)的。

编辑:如果你正在使用Python 2.7或更高版本,可以很容易地转换为OrderedDictequivalent version为Python 2.4及以上):

OrderedDict(heapq.nlargest(3, mydict.iteritems(), key=lambda tup: sum(tup[1]))) 

OrderedDict具有相同的API dict,但记得插入顺序。

+0

你如何为O(n + 3 log n)的,它应该是O(N日志K),或者当k = 3恒取消出来,你会得到O(n) – 2010-08-05 14:18:09

+0

在我的现实世界的例子中,它是几十万的前100名,因此heapq的例子可能是首选。谢谢。 – poezn 2010-08-05 17:43:08

+0

只是意识到这不会给我一个字典,但一组数组。有任何想法吗? – poezn 2010-08-05 20:52:02

2

对于这样一个小片不值得使用islice

sorted(mydict.iteritems(), key=lambda (k,v): sum(v), reverse=True)[:3]