Помогите разъяснить работу метода 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 шт):
Итак, давайте проанализируем ваше выражение
sorted(my_dict, key=my_dict.get, reverse=True)[:3]
(причем my_dict = {'a':500, 'b':5874, 'c': 560, 'd':400, 'e':5874, 'f': 20}
).
Что делает стандартная функция
sorted()
для словаря? Ее интересуют только ключи словаря, т.е. она будет сортировать только ключи. (Значения ключей она просто игнорирует.)
Таким образом,sorted(my_dict)
возвратила бы список['a', 'b', 'c', 'd', 'e', 'f']
.Метод
.get()
возвращает из словаря значение ключа, который задан как аргумент.
Например,my_dict.get('b')
возвращает5874
.
Это почти то же самое, что иmy_dict['b']
. Разница здесь не играет никакой роли.Что делает ключевой параметр
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'
по их оценкам.Но эта сортировка будет не по возрастанию оценок, а обратно, по убыванию, потому что использован ключевой параметр
reverse=True
(слово reverse значит обратно):элемент оценка ----------------- 'b' 5874 'e' 5874 'c' 560 'a' 500 'd' 400 'f' 20
Значит, получим список
['b', 'e', 'c', 'a', 'd', 'f']
Но нас интересуют только первые 3 элемента этого списка, потому еще сделаем из него срез из элементов с индексами
0
,1
и2
, т.е. от0
(включительно) до3
(не включая), что записывается как[0:3]
, или короче[:3]
.
Получим список['b', 'e', 'c']
.
result = sorted(my_dict, key = my_dict.get, reverse=True)[:3]
Может так понятней будет. Это по сути тоже самое, что использовать в качестве ключа сортировки key
такую анонимную функцию:
key = lambda x: my_dict.get(x)
То есть мы просто преобразуем ключ словаря в значение. Питон позволяет такие вещи записывать короче, вместо lambda x: func(x)
можно написать просто func
и это будет работать точно так же.