[英]Why does min() in Python return the key when a lambda is used on dictionaries?
我正在研究Python Cookbook,第3版。 我遇到了以下代码:
prices = {'ACME': 45.23,'AAPL': 612.78,'IBM': 205.55,'HPQ': 37.20,'FB': 10.75}
min(prices, key=lambda k: prices[k])
我在Python 3.6.0上测试了它,它返回'FB'。
我的理解是, prices
字典中的每个键都作为参数k
发送到lambda,然后lambda返回prices
字典中与键k
相关联的值。 因此,在遍历所有键之后,返回值列表,该列表用作min
函数的参数,该函数最终返回字典中的最小值(在本例中为10.75)。
但是当我运行代码时,程序打印出密钥(在本例中为“FB”)。 我哪里错了?
我已经完成了文档。 它表示min
返回可迭代中的最小项。 我知道min
处理键而不是值。 我只是不明白当lambda返回值列表时它是如何返回键的。 请帮帮我。
编辑 :抱歉编辑。 我试图找到字典中最小值的关键。 上面的代码完美无缺,但我不知道它是如何工作的。
你定义的lambda
函数将应用于所有键是正确的,但这并不意味着min
将返回lambda
函数可能返回的任何内容。
也许拼出这条线很有帮助
min(prices, key=lambda k: prices[k])
用语言:
“找到可迭代
prices
的最小值(字典键1 ), 就像每个键k
具有价值prices[k]
。”
如果需要关联值,可以使用返回的密钥来访问prices
>>> prices[min(prices, key=lambda k: prices[k])]
>>> 10.75
或者更短:
>>> min(prices.values())
>>> 10.75
1因为字典是可迭代的键( list(prices)
给出了键列表)。
为什么在字典中使用lambda时python中的min()返回键
因为迭代字典以任意顺序迭代键。 key
参数不是map参数。
如果你想要最小值,那么取
min(prices.items())
min(prices.values())
。
当您遍历字典时(正如您使用min()
隐式执行),它使用键。 min(prices)
相当于min(prices.keys())
。 所以min()
遍历字典中的每个KEYS,并使用lambda函数来比较它们。 它返回迭代的项目之一 - 所以其中一个键。
如果你想要这些项目,你可以使用min(prices.items())
,不需要密钥。
如果你想要两者,我会用你所拥有的东西来获得返回键的价格。
你提供的key
仅用于对你给出的迭代进行排序 - 在你的情况下,字典的所有键 - 根据你的key-definition
你得到的“一个”是最低的。
例:
data = ["a","bb","ccc","dddd"]
print( min( data, key = lambda x: -len(x))) # get the min value by negative length ascending
打印:
dddd
因为列表的元素是根据各自的负长度进行评估的:
['a', 'bb', 'ccc', 'dddd'] # iterable
[ -1, -2 , -3, -4 ] # the key-result
并且返回了iterable中的最小值: 'dddd'
如果你想要键和值,你可以使用:
>>> min(prices.items(), key=lambda kv: kv[1])
('FB', 10.75)
min
返回可迭代的最小项。 要确定哪些元素较小,它会使用密钥。 在这里,您要求的是最低prices
,因此它返回该可迭代的最小元素。 密钥告诉min
使用该密钥来决定迭代的哪些项目较小; min
仍然使用iterable的值,而不是应用于值的键,作为返回的最小值。 想象一下,如果有人说“告诉我哪个国家的人口最多”。 正确的答案是“中国”,而不是13.86亿。 1.386十亿是用来决定,中国是“最大的”,不就是最大的事情的价值。 当你写min(iterable, key=key)
,你要求key
最小的iterable
,而不是最小的key
。 基本上, min
相当于以下内容:
def min(iterable, key = lambda x:x):
cur_min = iterable.first
for item in iterable:
if key(item)<key(cur_min):
cur_min = item
return cur_min
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.