簡體   English   中英

在Python字典中查找最接近的值並返回其鍵

[英]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工作原理如下:

  1. d.items提取每個元組,即鍵值對。
  2. 將函數lambda x: abs(value - x[1])應用於每個元組,即計算絕對差值與value
  3. 計算lambda函數的最小結果並返回提供的參數,在本例中是d.items單個 tuple

注意PEP 3113從Python 3.x中刪除了元組參數解包,這就是我們必須在lambda通過x[1]顯式提取第一個值的原因。

您引用的代碼只是循環遍歷字典中的鍵值對,計算與預期值的差異並返回最小鍵值對。

要獲得該值,您可以簡單地執行此操作:

answer = min(dict.items(), key=lambda (_, value): abs(value - newValue))[1]
  • 注意上面的索引為[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) ,每sublistlists ,並返回其中元素len(sublist)是最小的。

檢查,提出的解決方案,

lambda (_, value): abs(value - newValue)

是一個(匿名)函數(使用元組參數解包 ,它不再適用於Python 3)應該采用一個項,一個(鍵,值)對,並返回abs(value - newValue) ,它測量valuenewValue接近程度。

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM