Python 以元组为键的字典中具有最高值的前n个键

Python 以元组为键的字典中具有最高值的前n个键,python,dictionary,Python,Dictionary,我想获得一个以元组为键的字典的前n个键,其中元组的第一个值是一个特定的数字(在下面的示例中为1): 我希望返回[1,0]和[1,2],其中tuple/key的第一个元素=1 这个 返回[1,4]和[1,3],第一个元素为1的最高键/元组,但如果我成功 k = heapq.nlargest(2, a, key=a.get(2,)) 它返回相同的内容?键参数应该是一个函数。但是您正在传入a.get(1,)。它所做的是调用a.get(1,),它与a.get(1)相同,它与a.get(1,无)相同 字

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

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

这个

返回[1,4]和[1,3],第一个元素为1的最高键/元组,但如果我成功

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

它返回相同的内容?

键参数应该是一个函数。但是您正在传入a.get(1,)。它所做的是调用
a.get(1,)
,它与
a.get(1)
相同,它与
a.get(1,无)
相同

字典没有
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))

首先,应仅获取第一个坐标为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)]
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)]