【问题标题】: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() 来执行此操作,还是我必须追溯与第一种方法给我的值对应的键?如果我在使用更大的字典时不必搜索它会更有效。

【问题讨论】:

  • 不,我的情况需要我不太熟悉的关键参数的不同自定义。这个问题我之前查过,其实我尝试的解决方案是基于它的top answer和其他一些问题。
  • Andrej Kesely 下面的答案使用了对现有问题的第二高评分答案的确切形式,并展示了如何使其适用于您的特定问题。

标签: python dictionary tuples min


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2019-04-22
      • 2013-04-12
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多