Нахождение ближайшего значения в словаре Python и возврат его ключа - PullRequest
0 голосов
/ 17 октября 2018

У меня есть значение

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), и я просто хочу ключ (какцелое).Кроме того, мне трудно понять, что именно делает этот код.

Есть ли более чистый способ сделать это?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Код, на который вы ссылались, просто перебирает пары значений ключа в словаре, вычисляя различия с ожидаемым значением и возвращая пару минимальных значений ключа.

Чтобы просто получить значение, вы можете просто сделатьэто:

answer = min(dict.items(), key=lambda (_, value): abs(value - newValue))[1]
  • обратите внимание на индексирование выше как [1] ​​

Вы уверены, что хотите, чтобы он был типом int, он округляется до ближайшегоцелое число

Я бы предложил просто обернуть приведенное выше выражение с помощью float ()

0 голосов
/ 17 октября 2018

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)

является (анонимной) функцией (с использованием Распаковка параметров кортежа , которая больше не работает в Python3) должен взять элемент, пару (ключ, значение) и вернуть abs(value - newValue), который измеряет, насколько близко value к newValue.

Если lambda смущает вас, воткак бы вы написали эту функцию key в Python 3 как обычную функцию.

>>> 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, это имя должно быть зарезервировано для встроенного типа словаря.

0 голосов
/ 17 октября 2018

Вы можете использовать последовательность распаковки, чтобы распаковать результат 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 такой же, как переменную, которую вы уже определили.

В противном случае логика через min работает следующим образом:

  1. Возьмите каждый кортеж, извлеченный из d.items, то есть пар ключ-значение.
  2. Примените функцию lambda x: abs(value - x[1]) к каждому кортежу, т.е. рассчитайте абсолютную разницу по сравнению с value.
  3. . Рассчитайтеминимальный результат из функции lambda и возвращаемый аргумент, в данном случае single tuple из d.items.

Примечание PEP 3113 удаляет распаковку параметров кортежа из Python 3.x, поэтому мы должны явно извлечь первое значение через x[1] в нашем lambda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...