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

时间:2013-04-18 12:27:04

标签: python list sorting

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

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

谢谢!

3 个答案:

答案 0 :(得分:88)

>>> 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级别,因此它尽可能快。

答案 1 :(得分:53)

from operator import itemgetter

sorted(your_list, key=itemgetter('name', 'age'))

答案 2 :(得分:0)

这是另一种通用解决方案 - 它按键和值对dict元素进行排序。 它的优点 - 不需要指定键,如果某些词典中缺少某些键,它仍然可以工作。

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)