разложение словаря и создание нового словаря с одинаковыми значениями - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть словарь myDict

{'1': 5, '2': 13, '3': 23, '4': 17}

Я использую этот код, который хорошо мне помог, чтобы найти ключ / значение в myDict, ближайшем к targetVal

answer = key, value = min(myDict.items(), key=lambda (_, v): abs(v - targetVal))

Предполагая, что targetVal равно 14, answer возвращает:

('2': 13)

Теперь мне нужно иметь дело с идентичными значениями в myDict.Например, если myDict было теперь:

{'1': 5, '2': 13, '3': 23, '4': 13}

, мне нужны обе эти пары ключ / значение со значением 13.В тех случаях, когда код (выше) находит ближайшее значение в myDict, и это значение появляется более одного раза, я хотел бы создать новый словарь.В этом случае answer вернет:

{'2': 13, '4': 13}

Можно ли обновить способ обнаружения answer для учета случаев, когда ближайшее значение появляется более одного раза?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

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

from math import inf

myDict = {'1': 5, '2': 13, '3': 23, '4': 13}
targetVal = 14

res = {}
diff = inf
for k, v in myDict.iteritems():
    current_diff = abs(v - targetVal)
    if current_diff <= diff:
        if current_diff < diff:
            diff = current_diff
            res.clear()
        res.update({k: v})

print(res)

# {'2': 13, '4': 13}
0 голосов
/ 25 ноября 2018

Сначала найдите минимальное значение, затем отфильтруйте dict.

>>> d = {'1': 5, '2': 13, '3': 23, '4': 13}
>>> target = 13
>>> min_ = min(d.itervalues(), key=lambda v: abs(v - target))
>>> {k:v for k,v in d.iteritems() if v == min_}
{'2': 13, '4': 13}
...