【问题标题】:Summarizing a dictionary of arrays in Python总结 Python 中的数组字典
【发布时间】:2010-08-05 00:58:56
【问题描述】:

我得到了以下字典:

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 个条目并对其进行排序。

例如,上面示例的 Top 3 sortedfiltered 列表将是

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 函数,但在实际语法方面遇到了困难。

【问题讨论】:

    标签: python algorithm arrays dictionary


    【解决方案1】:

    使用排序很容易:

    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 或更高版本,则可以轻松转换为 OrderedDictequivalent version 用于 Python 2.4+):

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

    OrderedDictdict 具有相同的 API,但会记住插入顺序。

    【讨论】:

    • 你如何得到 O(n + 3 log n),它应该是 O(n log k),或者当 k = 3 时常数抵消,你会得到 O(n)
    • 在我的真实示例中,它是几十万中的前 100 个,因此 heapq 示例可能是首选。谢谢。
    • 刚刚意识到这并没有给我一个字典,而是一个数组数组。有什么想法吗?
    • @Ants,你能解释一下你是如何计算的吗? Wikipedia gives O(n + k log n),根据我在回答中解释的原因,我认为这可以解决。
    【解决方案2】:

    对于这么小的切片,不值得使用 islice

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多