Получить пару ключ-значение на основе минимального значения в списке - PullRequest
2 голосов
/ 14 марта 2020

Я пытался найти это в Google, но не смог найти ответ относительно ситуации, подобной этой. У меня есть словарь в следующем формате:

    my_dict={'key1': ['some_data', 'some_more_data',6.0], 'key2': ['junk', 'some_more_junk',7.0], 'key3': ['something_good', 'good',1.0]}

Как мне go создать вспомогательный файл, содержащий только пару ключ-значение с наименьшим числом в конце списка? Другими словами, я бы хотел, чтобы мой вывод был:

    sub_dict={'key3': ['something_good','good',1.0]}        

Обратите внимание, что минимальное значение всегда будет в конце списка, остальные элементы в списке имеют отношение к ключу.

Ответы [ 4 ]

2 голосов
/ 14 марта 2020

Встроенная min функция имеет key аргумент ключевого слова.
Таким образом, вам не нужно сортировать .

my_dict = {'key1': ['some_data', 'some_more_data', 6.0],
           'key2': ['junk', 'some_more_junk', 7.0],
           'key3': ['something_good', 'good', 1.0],
           'key4': ['test', 'test', 1.0]}

min_value = min(my_dict.values(), key=lambda x: x[-1])[-1]
new_dict = {k: v for k, v in my_dict.items() if v[-1] == min_value}
print(new_dict)

вывод:

{'key3': ['something_good', 'good', 1.0], 'key4': ['test', 'test', 1.0]}
1 голос
/ 14 марта 2020
>>> min_value = sorted(my_dict.values(), key=lambda x: x[-1])[0][-1]
>>> {key: value for key, value in my_dict.items() if value[-1] == min_value}
{'key3': ['something_good', 'good', 1.0]}

Сначала получите min_value и отфильтруйте словарь таким образом, чтобы он получил все пары ключ-значение, которые соответствуют min_value.

. Таким образом получатся все такие ключи. пары значений, где последнее значение равно 1.0.


Вы также можете использовать min, чтобы получить минимальное значение напрямую:

min_value = min(my_dict.values(), key=lambda x: x[-1])[-1]
1 голос
/ 14 марта 2020

Вы можете выполнить сортировку, используя специальную функцию сортировки, которая получит нужную пару ключ-значение из словаря в качестве первого элемента:

sort_res = sorted(my_dict.items(), key=lambda kv: kv[1][-1])
k,v = list(sort_res)[0]
sub_dict = {k:v}

lambda kv: kv[1][-1] возвращает последний элемент списка и использует это для хранения. Так как он работает с парой ключ и значение, kv[1] соответствует значению.

Сортировка дает нам упорядоченные пары ключа и значения из словаря по последнему элементу из списка. Тогда достаточно взять первый и воссоздать словарь.

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

В этом случае вы можете выбрать все элементы из полученного списка вместо выбора только первого значения:

lsort_res = list(sort_res)
res_dict = {}
minv = lsort_res[0][1][-1]  # take the last element of the v list of the first k,v pair
for k,v in lsort_res:
   if v[-1] == minv:
       res_dict[k] = v
0 голосов
/ 14 марта 2020

Вы можете сделать так:

sub_dict={}
smallest = 999999
key=''
for k,v in my_dict.items():
  if v[-1] < smallest:
    smallest = v[-1]
    key = k
sub_dict[key] = my_dict[key]
...