【问题标题】:find max using key and lambda in python在 python 中使用 key 和 lambda 查找最大值
【发布时间】:2017-10-27 00:17:10
【问题描述】:

我在 python 中创建了一个字典,并想找到最大值。我用 key= 匿名函数尝试了 max 。我当然实现了错误,但不知何故代码运行了,我最终得到了一个键的输出,这对我来说根本没有意义。有人可以向我解释它为什么起作用以及如何起作用吗?谢谢。

Q['state1']={'zone':20,'left':50,'right':89,'forward':34}
qmax=max(Q['state1'],key=lambda x: x[1]) %this returns 'forward'
qmax=max(Q['state1'],key=lambda x: x[0]) %this returns 'zone'

【问题讨论】:

    标签: python python-2.7 dictionary lambda


    【解决方案1】:

    如果您将字典传递给max,它会遍历字典keys(这里是字符串列表),并且由于您指定了一个比较器函数,所以现在比较在x[1](第一行)上完成,恰好是每个键的 second 字符,x[0](在第二行)恰好是 first em> 每个键的字符。

    因此,例如,您有一个键列表:

    ['forward', 'zone', 'right', 'left']  
    

    请注意,此列表可以按任何顺序返回,因为字典没有顺序。现在,选择最大值的依据是第二个字符,所以你选择基于:

    ['f <b>o</b> rward', 'z <b>o</b> ne', 'r <b>i</b> ght', 'l <b>e</b> ft'] 

    碰巧的是,对于您的 CPython 实现,forwardzone 之前返回(尽管可能已返回任何一个,具体取决于从字典返回键的顺序)。

    【讨论】:

    • 注意:因为它是一个字符串键的字典,所以它甚至没有定义顺序,也没有定义元素插入和删除的顺序。作为一种安全措施(对于字符串、字节和日期时间)进行的哈希扰动意味着顺序可能因运行而异,在同一个解释器上,以完全相同的方式构建字典;每个新的解释器启动都会获得不同的哈希种子,因此字符串键重新排序。
    【解决方案2】:

    您正在迭代(字符串)键并在 lambda 中对它们进行索引以从键中的特定字母生成排序键,而不是迭代键/值对并使用 dict 键或价值。我猜你打算根据dict 键或值找到max,在这种情况下你想调用.items()(或避免在Py2.7 上临时使用.viewitems()):

    max(Q['state1'].viewitems(), key=lambda x: x[1])  # gets ('right', 89)
    max(Q['state1'].viewitems(), key=lambda x: x[0])  # gets ('zone', 20)
    

    或者,如果您根本不需要配对,请跳过key,直接迭代您关心的内容:

    max(Q['state1'].viewvalues())  # gets 89
    max(Q['state1'])  # gets 'zone'
    

    【讨论】:

      猜你喜欢
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多