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