我在python中创建了一个dict,想找到最大值。我用key = anonymous函数试验了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'
答案 0 :(得分:2)
如果你将字典传递给max
,它会遍历字典 keys (这里是一个字符串列表),因为你已经指定了一个比较器函数,比较现在在x[1]
(在第一行)完成,恰好是每个键的第二个字符,而x[0]
(在第二行)恰好是每个键的第一个字符。
因此,例如,您有一个键列表:
['forward', 'zone', 'right', 'left']
请注意,此列表可以按任何顺序返回,因为词典没有排序。现在,选择最大值的基础是第二个字符,因此您可以选择:
['f o rward', 'z o ne', 'r i ght', 'l e ft']
恰好,对于你的CPython实现,在forward
之前返回zone
(尽管可以返回任何一个,具体取决于从字典返回键的顺序)
答案 1 :(得分:1)
您正在迭代(字符串)键并在lambda
中对它们编制索引,以便从键中的特定字母生成排序键,而不是迭代键/值对并使用其中任何一个的排序键{ {1}}键或值。我猜您打算根据dict
密钥或值找到max
,在这种情况下,您想要拨打dict
(或避免临时Py2.7 .items()
):
.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