【问题标题】:5 maximum values in a python dictionarypython字典中的5个最大值
【发布时间】:2011-08-25 21:18:40
【问题描述】:

我有一本这样的字典:

A = {'a':10, 'b':843, 'c': 39,.....}

我想获取这个字典的 5 个最大值并用它存储一个新的字典。为了获得我所做的最大值:

max(A.iteritems(), key=operator.itemgetter(1))[0:]

也许这是一件容易的事,但我坚持了很长时间。请帮忙!!!

【问题讨论】:

    标签: python dictionary max


    【解决方案1】:

    无需使用 iteritems 和 itemgetter。 dict 自己的 get 方法工作正常。

    max(A, key=A.get)
    

    排序类似:

    sorted(A, key=A.get, reverse=True)[:5]
    

    最后,如果 dict 大小是无限的,使用堆最终会比完全排序快。

    import heapq
    heapq.nlargest(5, A, key=A.get)
    

    如需了解更多信息,请查看heapq documentation

    【讨论】:

    • 我怀疑如果 7 个值相同,它会起作用,它仍然会返回 5 个值
    • 谢谢,这很好。看来选择的那个不适用于python3.4
    • 它没有对我的值进行排序:(
    【解决方案2】:

    你很接近。您可以使用sorted [docs] 对列表进行排序并获取前五个元素:

    newA = dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:5])
    

    另见:Python Sorting HowTo

    【讨论】:

    • 这对于大型字典来说可能效率低下,但更有效的解决方案将复杂得多。 (例如,您可以实现部分快速排序,当较高的分区有 5 个或更多元素时,它不会对两个分区进行排序。)很可能sorted 技术足以满足 OP 的目的。
    • @keith-thompson 感谢您的评论。但是“大”字典有多少键呢?在我的字典中,我有 2000 个项目,它很大吗?
    • @Alejandro:如果排序会导致严重的性能问题,那就是“大”。对 2000 项列表(任何内容)进行排序将需要大约 20,000 次比较,但如果您的程序在您的手指离开回车键之前产生答案,则可能不值得优化。并且内置的sorted 操作可能会以我建议的那种手写的专用算法可能无法实现的方式进行优化。它已经过非常彻底的测试。
    • @Alejandro:看看 Coady 的回答。我觉得这样更好。
    • 我认为与为 top-n 算法编写自定义代码相比,上述建议可能会做得更好。以上使用了内置的 Python 例程,据我所知,这些例程可能在 C 中进行了优化。这使得它的常数因子可能好 20 倍。 20 * n lg 5 > n lg 2000。对于 1,000,000 个项目,也许手写代码会更快,但我仍然认为上述解决方案可以接受,不值得努力改进。
    【解决方案3】:

    你可以在这里使用collections.Counter

    dict(Counter(A).most_common(5))

    例子:

    >>> from collections import Counter
    >>> A = {'a' : 1, 'b' : 3, 'c' : 2, 'd' : 4, 'e' : 0, 'f' :5}
    >>> dict(Counter(A).most_common(5))
    {'a': 1, 'c': 2, 'b': 3, 'd': 4, 'f': 5}
    

    【讨论】:

    • 这是唯一返回值和键的答案,谢谢
    • 谢谢!我们如何获得最少 5 个元素?
    【解决方案4】:

    对于 Python 3

    import operator
    dict(sorted(A.items(), key=operator.itemgetter(1), reverse=True)[:5])
    

    【讨论】:

    • 怎么样:result = sorted(A.items(), key=lambda x: x[1], reverse=True)[:5]
    【解决方案5】:

    试试这个:

    dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:5])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 2021-09-13
      • 2020-03-16
      • 2014-06-25
      • 2021-07-30
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      相关资源
      最近更新 更多