Python: How to sort a list of dictionaries by several values? -
i want sort list @ first value , second value. there easy way this? here small example:
a = [{'name':'john','age':45}, {'name':'andi','age':23}, {'name':'john','age':22}, {'name':'paul','age':35}, {'name':'john','age':21}]
this command sorting list 'name'
:
sorted(a, key = lambda user: user['name'])
but how can sort list second value? 'age'
in example.
i want sorting (first sort 'name'
, sort 'age'
):
andi - 23 john - 21 john - 22 john - 45 paul - 35
thanks!
>>> = [{'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'}]
this sorts tuple of 2 attributes, following equivalent , faster/cleaner:
>>> 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'}]
from comments: @bakuriu
i bet there not big difference between two,
itemgetter
avoids bit of overhead because extracts keys , maketuple
during single opcode(call_function
), while callinglambda
have call function, load various constants(which other bytecodes) call subscript (binary_subscr
), buildtuple
, return it... that's lot more work interpreter.
to summarize: itemgetter
keeps execution on c
level, it's fast possible.
Comments
Post a Comment