我收到了以下字典:
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函数上链接一个求和和过滤函数,但是却对实际语法感到困惑。
答案 0 :(得分: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)并且重新堆积是O(log n)。
编辑:如果您使用的是Python 2.7或更高版本,则可以轻松转换为OrderedDict
(equivalent version for Python 2.4 +):
OrderedDict(heapq.nlargest(3, mydict.iteritems(), key=lambda tup: sum(tup[1])))
OrderedDict
与dict
具有相同的API,但会记住广告订单。
答案 1 :(得分:2)
对于这么小的切片,不值得使用islice
sorted(mydict.iteritems(), key=lambda (k,v): sum(v), reverse=True)[:3]