Я пытался использовать модуль orderedDict для сортировки моего словаря, но придумал этот вопрос, глядя на примерный код, как показано ниже:
# regular unsorted dictionary
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
Итак, что меня смутило в коде, это функция Лямбда, используемая внутри функции sorted(). Я понимаю, что 't' - это аргумент, и 't [0]' или 't [1]' являются выражением, но не могут определить, как 't' получить назначенное значение внутри sorted(). В коде кажется, что 't = d.items()' происходит автоматически?
Пожалуйста, помогите мне разобраться в этом механизме и спасибо за это!
Прежде всего, обратите внимание, что лямбда - это удобный способ определения регулярной функции, как любой другой. Этот код:
sorted(d.items(), key=lambda t: t[0])
функционально эквивалентен этому:
def get_first(t):
return t[0]
sorted(d.items(), key=get_first)
Вы передаете функцию для sorted
(а не результат ее вызова). sorted
принимает эту функцию и передает ей значение, когда это необходимо.
Например, sorted
может быть наивно определена следующим образом:
def sorted(original_values, KEY):
values = list(original_values) # create a copy
n = len(values)
for j in range(n):
for k in range(n - 1):
if KEY(values[k]) > KEY(values[k + 1]): # <----------
values[k], values[k + 1] = values[k + 1], values[k]
return values
Параметр KEY
- это функция, которая используется в строке со стрелкой для сравнения двух значений, чтобы увидеть, нужно ли их обменивать.
sorted
вызывает функцию с каждым значением в итерируемом, которое вы передаетеsorted