Поиск кратного минимума в словаре словарей

У меня есть python dict dicts, и я хотел бы найти все минимальные значения для каждого внутреннего dict, для каждого ключа во внешнем dict. Я поясню ниже на примере.

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

my_dict = {'a': {'b': 10, 'c': 5, 'd': 6, 'e': 6, 'f': 6}, 'b': {'a': 10, 'c': 5, 'd': 4, 'e': 4, 'f': 4}, 'c': {'a': 5, 'b': 5, 'd': 7, 'e': 7, 'f': 7}, 'd': {'a': 6, 'b': 4, 'c': 7, 'e': 0, 'f': 0},'e': {'a': 6, 'b': 4, 'c': 7, 'd' : 0, 'f': 0}, 'f': {'a': 6, 'b': 4, 'c': 7, 'd': 0, 'e': 0}}

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

Таким образом, для ключа a с словарем {'b': 10, 'c': 5, 'd': 6, 'e': 6, 'f': 6} минимальное значение равно 5, поэтому я бы поместил a в новый словарь, назначенный пустому списку, а затем добавил бы c в список, поскольку он соответствует значению 5.

Окончательный вывод для приведенного выше списка будет выглядеть так:

output{a: [c], b: [d, e, f], c: [a, b], d: [e, f], e: [d, f], f: [d, e ]}

Часть, с которой у меня возникают проблемы, заключается в том, что присутствует несколько минимальных значений. Например, внутренний словарь для f имеет два ключа (d и e, которые имеют значение 0, поэтому должны быть возвращены оба.

Вот код, который у меня есть до сих пор:

new_dict = {}
for k, v in my_dict.items():
    new_dict[k] = [min(v, key=v.get)]

print((new_dict))

Что дает мне:

{'a': ['c'], 'b': ['d'], 'c': ['a'], 'd': ['e'], 'e': ['d'], 'f': ['d']}

Таким образом, он возвращает правильный минимум, а не ВСЕ минимумы.

Спасибо за ваше время.


person Community    schedule 11.02.2019    source источник


Ответы (1)


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

new_dict = {}
for k, v in my_dict.items():
    min_val = min(v.values())
    new_dict[k] = [sk for sk, sv in v.items() if sv == min_val]

print(new_dict)
# {'a': ['c'], 'c': ['a', 'b'], 'f': ['e', 'd'], 'e': ['f', 'd'], 'd': ['f', 'e'], 'b': ['e', 'd', 'f']}
person slider    schedule 11.02.2019