代码之家  ›  专栏  ›  技术社区  ›  Psychotechnopath

返回字典中的三个最大值

  •  5
  • Psychotechnopath  · 技术社区  · 7 年前

    我有以下字典:

    '{0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}'
    

    对于这本字典,我想编写一个函数来返回 具有最高值的键值对(在本例中,键18、19、20)。

    我想到了以下几点:

    cachedict = nr_of_objects_per_century() #Dictionary mentioned above
    
    def top_3_centuries():
            max_nr_works_list = sorted(cachedict.values())
            top_3_values = []
            for i in range(len(max_nr_works_list)-3, len(max_nr_works_list)):
                top_3_values.append(max_nr_works_list[i])
                print(top_3_values)
    

    这会给我一个要查找的最大值列表。但我该如何从这里开始呢?有没有一种不进行反向查找的方法(这对字典来说很慢,对吗?)我觉得我可以更有效地完成这个任务。

    8 回复  |  直到 7 年前
        1
  •  6
  •   jpp    7 年前

    你也可以用 collections.Counter 具有 most_common (内部使用堆队列):

    from collections import Counter
    
    dct = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 
           9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 
           16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
    
    count = Counter(dct)
    print(count.most_common(3))  # [(19, 244675), (20, 115878), (18, 111490)]
    
        2
  •  6
  •   jpp    7 年前

    heapq.nlargest

    通过使用堆队列,可以避免在此处进行完全排序:

    from heapq import nlargest
    from operator import itemgetter
    
    dct = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49,
           9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408,
           16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
    
    res = nlargest(3, dct.items(), key=itemgetter(1))
    
    print(res)
    # [(19, 244675), (20, 115878), (18, 111490)]
    
        3
  •  3
  •   b-fg    7 年前

    您可以使用:

    a = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49,
           9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408,
           16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
    
    l = sorted(list(a.items()), key=lambda tup: tup[1], reverse=True)[:3]
    print(l) # [(19, 244675), (20, 115878), (18, 111490)]
    

    它转换字典 a 放入元组列表中,按 tup[1] ,反转它,得到前3个点击。

        4
  •  2
  •   Ma0    7 年前

    你可以这样做:

    dct = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
    
    res = [next(k for k in dct if dct[k]==v) for v in sorted(dct.values(), reverse=True)[:3]]
    print(res)  # -> [19, 20, 18]
    

    分解:

    • sorted(dct.values(), reverse=True)[:3] ::取字典最大值3。
    • next(k for k in dct if dct[k]==v) ::返回字典键,其值为上述3个值之一(迭代)。
        5
  •  2
  •   B. M.    7 年前

    通过两个简单步骤:

    aux = sorted([(v,k) for (k,v) in dic.items()])
    res = [(v,k) for (k,v) in aux[-3:]] 
    #[(18, 111490), (20, 115878), (19, 244675)]
    

    比快 nlargest Counter.most_common 在这个例子中。

        6
  •  2
  •   New2Python    7 年前

    这将返回您想要的:

    d = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
    
    print(sorted([(i,j) for i, j in d.items() if j in (sorted(d.values())[-3:])])[-3:])
    #[(18, 111490), (19, 244675), (20, 115878)]
    
        7
  •  1
  •   Corentin Limier    7 年前
    d = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
    
    d_items_sorted = sorted(d.items(), key=lambda x: x[1], reverse=True)
    
    d_items_sorted[:3]
    

    返回:

    [(19, 244675), (20, 115878), (18, 111490)]
    

    这是我能得到的最简单的代码,但是对字典进行排序需要花费O(nlogn),并且您应该能够在O(n)中执行相同的操作。

        8
  •  0
  •   George Bekh-Ivanov    7 年前

    你是在寻找最有效的方法还是仅仅是在形式/算法简单性方面的最佳方法?

    如果是后者,您应该考虑将字典项作为元组进行排序(您可以使用cachedict.items()获取它们),就像在这个答案中一样。 https://stackoverflow.com/a/613218/10453363

    只需按值对元组排序,然后获取最后3个元组(它们是键/值对)