返回与字典中第三个值最小的元组对应的键
Posted
技术标签:
【中文标题】返回与字典中第三个值最小的元组对应的键【英文标题】:Return key corresponding to the tuple with smallest third value from dictionary 【发布时间】:2021-02-08 19:51:29 【问题描述】:我正在尝试从元组字典中返回与具有最小第三索引值的元组对应的键(namedtuple
顶点作为键,元组以 3 个元素作为值)。
例如,假设我有元组:
vertex = namedtuple("Vertex", ["vertex_id", "vertex_x", "vertex_y"])
d = vertex(vertex_id='B', vertex_x=11, vertex_y=0): (4, 5, 9),
vertex(vertex_id='C', vertex_x=6, vertex_y=0): (2, 0, 2),
vertex(vertex_id='A', vertex_x=4, vertex_y=0): (0, 2, 3)
我需要一些东西来回复我Vertex(vertex_id='C', vertex_x=6, vertex_y=0)
。我正在尝试类似min(d.values(), key = lambda t: t[2])
(但这会返回元组(2, 0, 2)
,我必须将其追溯到它的键)或min(d, key = lambda t: t[2])
(这不是真的工作)。
有没有更好的方法来设置 min() 来执行此操作,还是我必须追溯与第一种方法给我的值对应的键?如果我在使用更大的字典时不必搜索它会更有效。
【问题讨论】:
这能回答你的问题吗? Get the key corresponding to the minimum value within a dictionary 不,我的情况需要我不太熟悉的关键参数的不同自定义。这个问题我之前查过,其实我尝试的解决方案是基于它的top answer和其他一些问题。 Andrej Kesely 下面的答案使用了对现有问题的第二高评分答案的确切形式,并展示了如何使其适用于您的特定问题。 【参考方案1】:字典不打算以这种方式使用。您不应尝试将值追溯到键。 试试这个:
keys = list(d.keys())
k = keys[0]
m = d[k]
for v in keys[1:]:
if d[v][2] < m[2]:
k = v
m = d[k]
你想要的顶点键将在 k 中。
【讨论】:
【参考方案2】:将min()
与自定义key=
函数一起使用。你可以在d.items()
的元组上搜索最小值:
print( min(d.items(), key=lambda k: k[1][2])[0] )
打印:
Vertex(vertex_id='C', vertex_x=6, vertex_y=0)
【讨论】:
为什么是k[1][2] ]
? [1]
访问什么?
@DaviMagalhães d.items()
返回格式为( (key1, items1), (key2, items2) ... )
的元组,因此索引[1]
在这些元组中定位项目。【参考方案3】:
如果您不强制使用 dict,我认为下面的代码是正确的方法。 无论如何 - 你可以看到一个现代的 NamedTuple 例子。
from typing import NamedTuple
class Vertex(NamedTuple):
id:str
x:int
y:int
class Triple(NamedTuple):
first:int
second:int
third:int
class Pair(NamedTuple):
vertex: Vertex
triple: Triple
pairs = [Pair(Vertex('B',11,0),Triple(4,5,9)),Pair(Vertex('C',6,0),Triple(2,0,2)),Pair(Vertex('A',4,0),Triple(0,2,3))]
_min = min(pairs,key=lambda p: p.triple.third)
print(_min.vertex)
【讨论】:
以上是关于返回与字典中第三个值最小的元组对应的键的主要内容,如果未能解决你的问题,请参考以下文章