python字典统计排序大学_Python:如何按几个值对字典列表进行排序?

I want to sort a list at first by a value and then by a second value. Is there an easy way to do this? Here is a 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 is for sorting this list by 'name':

sorted(A, key = lambda user: user['name'])

But how I can sort this list by a second value? Like 'age' in this example.

I want a sorting like this (first sort by 'name' and then sort by 'age'):

andi - 23

john - 21

john - 22

john - 45

paul - 35

Thanks!

解决方案>>> 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'}]

This sorts by a tuple of the two attributes, the following is equivalent and much faster/cleaner:

>>> 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'}]

From the comments: @Bakuriu

I bet there is not a big difference between the two, but itemgetter avoids a bit of overhead because it extracts the keys and make the tuple during a single opcode(CALL_FUNCTION), while calling the lambda will have to call the function, load the various constants(which are other bytecodes) finally call the subscript (BINARY_SUBSCR), build the tuple and return it... that's a lot more work for the interpreter.

To summarize: itemgetter keeps the execution fully on the C level, so it's as fast as possible.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值