Return 键对应于字典中第三个值最小的元组
Return key corresponding to the tuple with smallest third value from dictionary
我正在尝试 return 与元组字典中具有最小第三索引值的元组对应的键(一个 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)}
我需要一些东西 return 我 Vertex(vertex_id='C', vertex_x=6, vertex_y=0)
。我正在尝试类似 min(d.values(), key = lambda t: t[2])
的东西(但是这个 return 是元组 (2, 0, 2)
并且我必须将它追溯到它的键)或 min(d, key = lambda t: t[2])
(这不是真的工作)。
是否有更好的方法来设置 min() 来执行此操作,或者我是否必须追溯与第一种方法给我的值对应的键?如果我在使用更大的词典时不必搜索它会更有效率。
字典不适合那样使用。您不应尝试将值追溯到键。
试试这个:
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中。
将 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)
如果您不强制使用字典,我认为下面的代码是正确的方法。
无论如何 - 你可以看到一个现代的 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)
我正在尝试 return 与元组字典中具有最小第三索引值的元组对应的键(一个 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)}
我需要一些东西 return 我 Vertex(vertex_id='C', vertex_x=6, vertex_y=0)
。我正在尝试类似 min(d.values(), key = lambda t: t[2])
的东西(但是这个 return 是元组 (2, 0, 2)
并且我必须将它追溯到它的键)或 min(d, key = lambda t: t[2])
(这不是真的工作)。
是否有更好的方法来设置 min() 来执行此操作,或者我是否必须追溯与第一种方法给我的值对应的键?如果我在使用更大的词典时不必搜索它会更有效率。
字典不适合那样使用。您不应尝试将值追溯到键。
试试这个:
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中。
将 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)
如果您不强制使用字典,我认为下面的代码是正确的方法。
无论如何 - 你可以看到一个现代的 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)