Python:如何按几个值对字典列表进行排序?

发布于 2021-01-29 17:07:07

我想先按一个值对列表进行排序,然后再按第二个值对列表进行排序。是否有捷径可寻?这是一个小例子:

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

此命令用于按以下顺序对列表进行排序'name'

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

但是,如何按第二个值对列表进行排序?就像'age'在这个例子中一样。

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

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

谢谢!

关注者
0
被浏览
151
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。
    >>> 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在单个opcode(CALL_FUNCTION)期间生成,同时调用lambdawill必须调用函数,加载各种常量(其他字节码)最后调用下标(BINARY_SUBSCR),构建tuple并返回它……对于解释器而言,这还有很多工作要做。

    总结一下:itemgetter将执行完全保持在C水平上,因此它尽可能快。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看