Ответ 1
>>> A = [{'name':'john','age':45},
{'name':'andi','age':23},
{'name':'john','age':22},
{'name':'paul','age':35},
{'name':'john','age':21}]
>>> sorted(A, key = lambda user: (user['name'], user['age']))
[{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}]
Это сортирует по кортежу из двух атрибутов, следующее эквивалентно и намного быстрее/чище:
>>> from operator import itemgetter
>>> sorted(A, key=itemgetter('name', 'age'))
[{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}]
Из комментариев: @Bakuriu
Я уверен, что между ними нет большой разницы, но
itemgetter
избегает бит служебных данных, потому что он извлекает ключи и делаетtuple
в течение одного кода операции (CALL_FUNCTION
), вызываяlambda
нужно будет вызвать функцию, загрузить различные константы (которые являются другими байткодами), наконец, вызвать индекс (BINARY_SUBSCR
), построитьtuple
и вернуть его... что гораздо больше работает для интерпретатора.
Подводя итог: itemgetter
полностью выполняет выполнение на уровне C
, поэтому он как можно быстрее.