python - 总结 Python 中的数组字典

标签 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,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 函数上链接求和和过滤函数,但在实际语法上遇到了困难。

最佳答案

排序很容易:

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 对于 Python 2.4+):

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

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

关于python - 总结 Python 中的数组字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411025/

相关文章:

python - 使用参数时 flask 中的 url_for

python - Django 鹡鸰 'expected string or bytes-like object' 错误

python - 根据具有特定值的行创建新的 Dataframe 并从原始 Dataframe 中删除行

python - 使用具有两列以上的 df 的子图中的堆叠条形图

algorithm - 简化表达式 k/m%n

arrays - AWK:如何将文件加载到数组中并将最终结果存储到另一个数组中

algorithm - 是否总是可以使用至多 O(n) 树旋转将一个 BST 转换为另一个?

android - 色差atan和atan2结果差异

python - 无法使用 np.where() 在复杂的 2D Python 数组中查找元素的索引

javascript - 如果对象在包含多个对象的数组中,如何检查 JavaScript?