【问题标题】:Basic way to find largest values in dictionary [duplicate]在字典中查找最大值的基本方法[重复]
【发布时间】:2015-04-14 00:42:39
【问题描述】:

假设我有一本字典。我想找到具有最高值的 4 个键。我想以一种非常基本的方式做到这一点。我对CS没有那么先进。我只想遍历字典。或者我应该怎么做?我意识到这不可能那么具有挑战性。我不想使用 heapq。我怎样才能做到这一点?

【问题讨论】:

  • 最高值是什么意思?最高数?最大长度?
  • 你关心返回最高值的顺序吗?
  • @martineau 我不在乎它们以什么顺序返回
  • @martineau 我只需要尽可能以最基本的方式完成它

标签: python dictionary max


【解决方案1】:

我认为最pythonic的方式是:

sorted(d, key=d.get, reverse=True)[:4]

【讨论】:

  • sorted(d, key=d.get)[-4:] 会更短...
  • 我认为这个肯定比我的要好,但我想我还是会做一个修改。我不喜欢通过简单地迭代dict 来迭代dict 的键——我认为隐含的行为总是让人们感到困惑。我更喜欢更明确的sorted(d.keys(), key=d.get ... )
  • 使用d.get() 不如O(n) 解决方案最佳。为什么不只是迭代项目? collection.Counter.most_common上使用的解决方案是sorted(self.items(), key=itemgetter(1), reverse=True)
  • @jwilner 我有点明白你的意思。你能告诉我那个修正案是什么样子的吗?
  • @jwilner 问题在于它在 python 2.x 上是浪费的,不必要地复制内存中的列表,稍后将被垃圾收集。无论如何,dicts 遍历键应该是常见的 python 知识,imo。
【解决方案2】:

您应该改用collections.Counter 对象。

c = collections.Counter(original_dict)
c.most_common(4)

如果你只想要钥匙,那么:

[k for k, v in c.most_common(4)]

如需参考如何实现,请查看源代码here

【讨论】:

  • @Shashank 你可以使用Counter 来计算任何东西。自己试试代码。这也更干净
  • 收回,它有效:)
  • 好技巧!它在后台使用 heapq
【解决方案3】:

按值排序,然后切片。 sorted 函数接受一个关键函数。

items_by_value = sorted(d.items(), key=lambda (k, v): v) 
keys = [k for k, v in items_by_value[-4:]]

【讨论】:

    【解决方案4】:

    好问题。

    假设d 是字典,如果您不关心键的顺序,您可以使用如下内容:

    keys = [v[0] for v in sorted(d.items(), key=lambda v: v[1])[-4:]]
    

    对于庞大的字典,使用起来会更有效率:

    keys = [v[0] for v in sorted(d.items(), key=operator.itemgetter(1))[-4:]]
    

    [-4:] 表示最后四个条目。在这两种情况下,如果您希望键与其对应的最高值的顺序相同,请改用[-1:-5:-1],它们是倒序的最后四个条目。

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 2017-12-23
      • 1970-01-01
      • 2021-04-25
      • 2019-06-07
      • 2020-05-03
      • 2016-01-19
      • 1970-01-01
      • 2020-02-20
      相关资源
      最近更新 更多