总结Python中的数组字典

总结Python中的数组字典,python,algorithm,arrays,dictionary,Python,Algorithm,Arrays,Dictionary,我得到了以下词典: 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

我得到了以下词典:

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个条目

例如,上面示例的前三名排序的和过滤的列表将是

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 logn)),因为前3项可以在O(n)中完成。例如,使用堆模块:

heapq.nlargest(3, mydict.iteritems(), key=lambda tup: sum(tup[1]))
这是O(n+3logn),因为初始堆是O(n),重新堆化是O(logn)

编辑:如果您使用的是Python 2.7或更高版本,则可以轻松地转换为(对于Python 2.4+):


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

对于如此小的一个片段,不值得使用islice

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

如何得到O(n+3logn),它应该是O(nlogk),或者当k=3时,常数被抵消,在我的现实世界示例中得到O(n),它是几十万中的前100个,因此heapq示例可能是首选的。谢谢。我刚意识到这不是字典而是数组数组。有什么想法吗?@Ants,你能解释一下你是怎么计算的吗?维基百科O(n+k logn),我认为这是正确的,基于我在回答中解释的原因。
sorted(mydict.iteritems(), key=lambda (k,v): sum(v), reverse=True)[:3]