我得到了以下字典:
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 函数上链接一个 sum 和 filter 函数,但在实际的语法上挣扎。
这很容易做一个排序:
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 或更高版本,则可以轻松转换为OrderedDict
(equivalent version适用于 Python 2.4 +):
OrderedDict(heapq.nlargest(3, mydict.iteritems(), key=lambda tup: sum(tup[1])))
OrderedDict
与dict
具有相同的 API,但记住插入顺序。
对于这么小的切片,不值得使用 islice
sorted(mydict.iteritems(), key=lambda (k,v): sum(v), reverse=True)[:3]
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(4条)