Python:如何sorting几个值的字典列表?

我想首先按值sorting,然后按第二个值sorting。 是否有捷径可寻? 这是一个小例子:

A = [{'name':'john','age':45}, {'name':'andi','age':23}, {'name':'john','age':22}, {'name':'paul','age':35}, {'name':'john','age':21}] 

这个命令是用'name'对这个列表进行sorting'name'

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

但是我怎么能通过第二个值来sorting这个列表呢? 像这个例子中的'age'一样。

我想要这样的sorting(首先按'name'sorting,然后按'age'sorting):

 andi - 23 john - 21 john - 22 john - 45 paul - 35 

谢谢!

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

这两个属性的元组sorting,以下是相当的,更快/更清洁:

 >>> 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避免了一些开销,因为它在一个操作码( CALL_FUNCTION )中提取了键并且创build了tuple ,而调用lambda将不得不调用该函数,加载各种常量(这是其他字节码)最后调用下标( BINARY_SUBSCR ),构buildtuple并返回它…这对解释器来说是更多的工作。

总结一下: itemgetter将执行完全保留在C级别,所以尽可能快。

 from operator import itemgetter sorted(your_list, key=itemgetter('name', 'age')) 

这里是另一个通用的解决scheme – 它通过键和值对字典的元素进行sorting。 它的优点 – 不需要指定键,如果某些字典中某些键丢失,它仍然可以工作。

 def sort_key_func(item): """ helper function used to sort list of dicts :param item: dict :return: sorted list of tuples (k, v) """ pairs = [] for k, v in item.items(): pairs.append((k, v)) return sorted(pairs)