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)