Python 以元组为键的字典中具有最高值的前n个键
我想获得一个以元组为键的字典的前n个键,其中元组的第一个值是一个特定的数字(在下面的示例中为1): 我希望返回[1,0]和[1,2],其中tuple/key的第一个元素=1 这个 返回[1,4]和[1,3],第一个元素为1的最高键/元组,但如果我成功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,无)相同 字
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)]