我想首先按值排序,然后按第二个值排序。是否有捷径可寻?这是一个小例子:
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 :(得分: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)