Понимание лямбда-функции сортировки - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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)

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

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

>>> 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)

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

Первый [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)
0 голосов
/ 13 сентября 2018
>>> sorted(d.items(),key=lambda x: (-x[1],x[0]))

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...