繁体   English   中英

为什么Python中的min()在字典上使用lambda时返回密钥?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM