Помогите разъяснить работу метода get

Есть словарь my_dict = {'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20}.

Необходимо вывести три ключа с наибольшим значением.

В интернете нашел решение такое:

result = sorted(my_dict, key = my_dict.get, reverse=True)[:3]

Результат работы: ['b', 'e', 'c'].

Объясните, пожалуйста, как работает key=my.dict.get? Методу же необходим аргумент, да и вообще он выводит значение ключа... Почему результат работы именно такой?


Ответы (2 шт):

Автор решения: MarianD

Итак, давайте проанализируем ваше выражение

sorted(my_dict, key=my_dict.get, reverse=True)[:3]

  (причем my_dict = {'a':500, 'b':5874, 'c': 560, 'd':400, 'e':5874, 'f': 20}).

  1. Что делает стандартная функция sorted() для словаря? Ее интересуют только ключи словаря, т.е. она будет сортировать только ключи. (Значения ключей она просто игнорирует.)
    Таким образом, sorted(my_dict) возвратила бы список ['a', 'b', 'c', 'd', 'e', 'f'].

  2. Метод .get() возвращает из словаря значение ключа, который задан как аргумент.
    Например, my_dict.get('b') возвращает 5874.
    Это почти то же самое, что и my_dict['b']. Разница здесь не играет никакой роли.

  3. Что делает ключевой параметр key=my_dict.get? Он обозначает, что мы будем сортировать элементы (в нашем случае ключи словаря) не по значениям самих элементов — сначала к каждому элементу будет применена функция my_dict.get, т.е. сделается

    my_dict.get('a')     # результат:  500
    my_dict.get('b')     # результат: 5874
    my_dict.get('c')     # результат:  560
    my_dict.get('d')     # результат:  400
    my_dict.get('e')     # результат: 5874
    my_dict.get('f')     # результат:   20
    

    и получится «оценка» для каждого элемента (ключа словаря):

    элемент    оценка 
    -----------------
      'a'        500
      'b'       5874
      'c'        560
      'd'        400
      'e'       5874
      'f'         20
    

    и после этого начнется сортировка ключей 'a', 'b', 'c', 'd', 'e' и 'f' по их оценкам.

  4. Но эта сортировка будет не по возрастанию оценок, а обратно, по убыванию, потому что использован ключевой параметр reverse=True (слово reverse значит обратно):

    элемент    оценка 
    -----------------
      'b'       5874
      'e'       5874
      'c'        560
      'a'        500
      'd'        400
      'f'         20
    

    Значит, получим список

    ['b', 'e', 'c', 'a', 'd', 'f']
    
  5. Но нас интересуют только первые 3 элемента этого списка, потому еще сделаем из него срез из элементов с индексами 0, 1 и 2, т.е. от 0 (включительно) до 3 (не включая), что записывается как [0:3], или короче [:3].
    Получим список ['b', 'e', 'c'].

→ Ссылка
Автор решения: CrazyElf
result = sorted(my_dict, key = my_dict.get, reverse=True)[:3]

Может так понятней будет. Это по сути тоже самое, что использовать в качестве ключа сортировки key такую анонимную функцию:

key = lambda x: my_dict.get(x)

То есть мы просто преобразуем ключ словаря в значение. Питон позволяет такие вещи записывать короче, вместо lambda x: func(x) можно написать просто func и это будет работать точно так же.

→ Ссылка