Понимание сортировки лямбда-функций

Я решаю некоторые проблемы на Python, я не знал, как решить, поэтому я посмотрел в решении и увидел использование лямбда, я знаю, как это работает, но здесь так сложно понять, не мог бы кто-нибудь объяснить мне что происходит?

Для примера у нас есть это изречение:

d = {'000000000': 156, '255000000': 228, '255255255': 228, '000255000': 228}
return sorted(d.items(),key=lambda x: (-x[1],x[0]))[0][0] 

Возвращает: 000255000

А также :

d = {(0, 0, 0): 156, (255, 0, 0): 228, (255, 255, 255): 228, (0, 255, 0): 228}
return sorted(d.items(),key=lambda x: (-x[1],x[0][0],x[0][1],x[0][2]))[0][0]  

Возвращает: (0, 255, 0)

Я не могу дать хорошего ответа, но рекомендую это сообщение в блоге и Вот этот

Lucas Wieloch 13.09.2018 18:06

Думаю вы ищите min

juanpa.arrivillaga 13.09.2018 18:10
0
2
47
2

Ответы 2

>>> sorted(d.items(),key=lambda x: (-x[1],x[0]))

возвращает это

[('000255000', 228), ('255000000', 228), ('255255255', 228), ('000000000', 156)]

По сути, он просто сортирует ключ, значение, рассматривая их как кортеж (-значение, ключ).

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

>>> d = {'000000000': 156, '255000000': 228, '255255255': 228, '000255000': 228}
>>> key = lambda x: (-x[1],x[0])
>>> for x in d.items(): print(x, key(x))

('000000000', 156) (-156, '000000000')
('255000000', 228) (-228, '255000000')
('255255255', 228) (-228, '255255255')
('000255000', 228) (-228, '000255000')

Таким образом, d.items(), очевидно, выполняет итерацию по парам "ключ-значение" словаря. А лямбда - это функция, которая при вызове с этой парой ключ-значение возвращает преобразованное значение.

Затем это значение используется для сортировки результата:

>>> result = sorted(d.items(),key=key)
>>> for x in result: print(x)

('000255000', 228)
('255000000', 228)
('255255255', 228)
('000000000', 156)

Поскольку функция key используется только для сортировки элементов, фактические элементы результата по-прежнему являются исходными парами «ключ-значение» словаря.

Затем первый [0] получает первый элемент из результата, то есть самый маленький элемент. И второй [0] получает ключ из этого кортежа ключ-значение:

>>> result[0]
('000255000', 228)
>>> result[0][0]
'000255000'

Во втором примере происходит то же самое. Просто ключевая функция немного сложнее:

>>> d = {(0, 0, 0): 156, (255, 0, 0): 228, (255, 255, 255): 228, (0, 255, 0): 228}
>>> key = lambda x: (-x[1],x[0][0],x[0][1],x[0][2])
>>> for x in d.items(): print(x, key(x))

((0, 0, 0), 156) (-156, 0, 0, 0)
((255, 0, 0), 228) (-228, 255, 0, 0)
((255, 255, 255), 228) (-228, 255, 255, 255)
((0, 255, 0), 228) (-228, 0, 255, 0)

Другие вопросы по теме