У меня есть словарь, такой как:
d = {'a':[0,0], 'b':[0,0], 'c':[0,1], 'd':[1,1]}
Там порядок значений, в основном лексикографический, такой, что [0, 0] < [0,1] < [1,1]
.
Мне интересно получить ключи, значения которых минимальны в соответствии с этим порядком. В этом случае желаемый результат:
result = ['a', 'b']
Я могу сделать это посредством (1) получения значений dict, (2) преобразования его в список L, (3) сортировку L с помощью:
L.sort(key = str),
затем (4) получить минимальный элемент m отсортированного L и, наконец, (5) извлечь ключи, значения которых равны m.
Я могу думать о других вариантах этой процедуры, но все они включают в себя изучение словаря и сравнение вещей, и все они, возможно, слишком запутаны.
Мой вопрос в том, есть ли более простой, более элегантный (и более эффективный) способ сделать это. Должен ли я использовать другую структуру данных вместо словаря в первую очередь?
Самый простой способ - использовать функцию min()
чтобы найти минимальное значение, затем выбрать ключи, соответствующие этому минимуму, используя понимание списка:
d = {'a': [0, 0], 'b': [0, 0], 'c': [0, 1], 'd': [1, 1]}
min_value = min(d.values())
keys = [key for key, val in d.items() if val == min_value]
Это решение имеет сложность времени O(n)
.
Вы также можете использовать itertools.groupby
, хотя для этого потребуется сортировка словаря по значениям (и, следовательно, выполняется в O(n log n)
):
from itertools import groupby
keys = next(list(g) for k, g in groupby(sorted(d, key=d.get), key=d.get))