簡體   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