![](/img/trans.png)
[英]Python: Finding key with its value having the maximum absolute value in dictionary
[英]Finding the closest value in a Python dictionary and returning its key
我有一個價值
value = 0.04532
還有一個類似的字典
{'1': 0.02827, '2': 0.0, '3': 0.09827, '4': 0.04533}
我想簡單地返回字典中最接近原始值的值的鍵,在這種情況下為4
我找到了一個類似這樣的老帖子
newValue = value
answer = min(dict.items(), key=lambda (_, value): abs(value - newValue))
這將返回元組('4', 0.04533)
,我只想要鍵(作為int)。 此外,我無法理解代碼正在做什么。
有沒有更簡潔的方法來完成這項工作?
您可以使用序列解包來解壓縮tuple
結果:
value = 0.04532
d = {'1': 0.02827, '2': 0.0, '3': 0.09827, '4': 0.04533}
res_key, res_val = min(d.items(), key=lambda x: abs(value - x[1]))
print(res_key, res_val, sep=', ')
4, 0.04533
問題的一半似乎出現在您選擇的變量中。 確保你沒有影響類名,例如調用字典d
,而不是dict
。 同樣,不要將lambda
的參數命名為與已定義的變量相同的參數。
否則,邏輯via min
工作原理如下:
d.items
提取每個元組,即鍵值對。 lambda x: abs(value - x[1])
應用於每個元組,即計算絕對差值與value
。 lambda
函數的最小結果並返回提供的參數,在本例中是d.items
的單個 tuple
。 注意PEP 3113從Python 3.x中刪除了元組參數解包,這就是我們必須在lambda
通過x[1]
顯式提取第一個值的原因。
您引用的代碼只是循環遍歷字典中的鍵值對,計算與預期值的差異並返回最小鍵值對。
要獲得該值,您可以簡單地執行此操作:
answer = min(dict.items(), key=lambda (_, value): abs(value - newValue))[1]
你確定你想要它作為一個int類型,它會向下舍入到最接近的整數
我建議用float()包裝上面的語句
dict.items
為您提供字典的(鍵,值)對。
>>> d = {'1': 0.02827, '2': 0.0, '3': 0.09827, '4': 0.04533}
>>> d.items()
dict_items([('1', 0.02827), ('3', 0.09827), ('2', 0.0), ('4', 0.04533)])
返回值是可迭代的,因此可以傳遞給min
。
min
還接受一個必須是可調用的關鍵字參數key
(通常是一個函數)。 它是min
從第一個參數中評估元素以找到最小值的標准。
這是一個更簡單的例子。 假設我們需要在列表列表中找到最短列表。
>>> lists = [[1, 2], [1, 2, 3], [5]]
>>> min(lists, key=len)
[5]
min
遍歷lists
,調用len(sublist)
,每sublist
中lists
,並返回其中元素len(sublist)
是最小的。
檢查,提出的解決方案,
lambda (_, value): abs(value - newValue)
是一個(匿名)函數(使用元組參數解包 ,它不再適用於Python 3)應該采用一個項,一個(鍵,值)對,並返回abs(value - newValue)
,它測量value
與newValue
接近程度。
如果lambda
讓你感到困惑,那么你將如何在Python 3中將該key
函數作為普通函數編寫。
>>> def criterion(dict_item):
... key, value = dict_item # unpack
... return abs(value - newValue)
你現在可以發行
>>> newValue = 0.04532
>>> d = {'1': 0.02827, '2': 0.0, '3': 0.09827, '4': 0.04533}
>>>
>>> min(d.items(), key=criterion)
('4', 0.04533)
如果您只想將鍵作為整數,請從索引0
獲取它並將其轉換為int
。
>>> int(min(d.items(), key=criterion)[0])
4
最后,不要使用變量名dict
,該名稱應保留為內置字典類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.