In [6]: sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v))
Out[6]:
[('a2', ['e', 2]),
('a4', ['s', 2]),
('a3', ['h', 3]),
('a1', ['g', 6]),
('a6', ['y', 7]),
('a5', ['j', 9])]
Ключевым параметром всегда является функция, которая подается по одному элементу из повторяемого (mydict.iteritems()
) за один раз.В этом случае элемент может быть чем-то вроде
('a2',['e',2])
Поэтому нам нужна функция, которая может принимать ('a2',['e',2])
в качестве ввода и возвращать 2.
lambda (k,v): ...
- это анонимная функция, котораяпринимает один аргумент - 2-кортеж - и распаковывает его в k
и v
.Поэтому, когда к нашему элементу применяется функция lambda
, k
будет 'a2'
, а v
будет ['e',2]
.
lambda (k,v): operator.itemgetter(1)(v)
, примененный к нашему элементу, таким образом, возвращает operator.itemgetter(1)(['e',2])
, который "itemgets" второй элемент в ['e',2]
, который равен 2.
Обратите внимание, что lambda (k,v): operator.itemgetter(1)(v)
не является хорошимспособ кодирования в Python.Как указывает Гнибблер, operator.itemgetter(1)
пересчитывается для каждого элемента .Это неэффективно.Смысл использования operator.itemgetter(1)
заключается в создании функции, которую можно применять много раз.Вы не хотите заново создавать функцию каждый раз.lambda (k,v): v[1]
более читабельно и быстрее:
In [15]: %timeit sorted(mydict.iteritems(), key=lambda (k,v): v[1])
100000 loops, best of 3: 7.55 us per loop
In [16]: %timeit sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v))
100000 loops, best of 3: 11.2 us per loop