Я решаю некоторые проблемы на 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)
Думаю вы ищите min
>>> 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)
Я не могу дать хорошего ответа, но рекомендую это сообщение в блоге и Вот этот