Чтобы понять подобный код, разбейте его на составляющие и посмотрите на отдельные результаты, которые вы получите.Таким образом, вы можете следить за тем, какая часть кода выполняет то, что делает, и вы сможете понять это проще:
>>> 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)