【问题标题】:top n keys with highest values in dictionary with tuples as keys以元组为键的字典中具有最高值的前 n 个键
【发布时间】:2015-05-02 19:50:15
【问题描述】:

我想以元组为键获取字典的前 n 个键,其中元组的第一个值是特定数字(下例中为 1):

a = {}
a[1,2] = 3
a[1,0] =4
a[1,5] = 1
a[2,3] = 9

我希望返回 [1,0] 和 [1,2],其中元组/键的第一个元素 = 1

这个

import heapq
k = heapq.nlargest(2, a, key=a.get(1,))

返回 [1,4] 和 [1,3],第一个元素 = 1 的最高键/元组,但如果我做到了

k = heapq.nlargest(2, a, key=a.get(2,))

它返回相同的东西?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    首先,您应该只取第一个坐标为 1 的键。否则,如果有几个元素的第一个坐标为 1,也有可能获得其他元组。然后就可以正常使用heapq了。例如:

    a = {
        (1, 2): 3,
        (1, 0): 4,
        (1, 5): 1,
        (2, 3): 9
    }
    
    import heapq
    print heapq.nlargest(2, (k for k in a if k[0] == 1), key=lambda k: a[k])
    print heapq.nlargest(2, (k for k in a if k[0] == 2), key=lambda k: a[k])
    

    输出:

    [(1, 0), (1, 2)]
    [(2, 3)]
    

    【讨论】:

      【解决方案2】:

      key 参数应该是一个函数。但是您传递的是a.get(1,)。它的作用是调用a.get(1,),它与a.get(1) 相同,与a.get(1, None) 相同。

      字典没有1 键,因此它返回None,这意味着您正在执行相当于传递key=None 的操作,这与根本不传递key 相同:您正在使用身份函数为key

      然后heapq.nlargest 返回顶部的2 元素,正确地是[1, 4][1, 3]

      这解释了为什么使用 a.get(1,)a.get(2,) 会做同样的事情。上述推理适用于这两种值,在这两种情况下您最终都会得到key=None

      要实现您想要的,请使用以下内容:

      key=lambda x: (x[0] == 1, a[x])
      

      如果你发现自己经常使用这种键,你可以创建一个键生成器功能:

      def make_key(value, container):
          def key(x):
              return x[0] == value, container[x]
          return key
      

      将其用作:

      nlargest(2, a, key=make_key(1, a))
      nlargest(2, a, key=make_key(2, a))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 2020-05-12
        相关资源
        最近更新 更多