如何按特定键的值对词典列表进行排序?鉴于:

[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]

按名称排序时,应为:

[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]

当前回答

如果不需要字典的原始列表,可以使用自定义键函数使用sort()方法对其进行修改。

关键功能:

def get_name(d):
    """ Return the value of a key in a dictionary. """

    return d["name"]

要排序的列表:

data_one = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]

将其分类到位:

data_one.sort(key=get_name)

如果需要原始列表,请调用sorted()函数,将列表和键函数传递给它,然后将返回的排序列表分配给新变量:

data_two = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
new_data = sorted(data_two, key=get_name)

正在打印data_one和new_data。

>>> print(data_one)
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
>>> print(new_data)
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]

其他回答

import operator

要按key='name'对词典列表进行排序:

list_of_dicts.sort(key=operator.itemgetter('name'))

要按key='age'对词典列表进行排序,请执行以下操作:

list_of_dicts.sort(key=operator.itemgetter('age'))

按多个列排序,其中一些列按降序排序:cmps数组是cmp函数的全局数组,包含字段名,对于desc,inv==-1,对于asc

def cmpfun(a, b):
    for (name, inv) in cmps:
        res = cmp(a[name], b[name])
        if res != 0:
            return res * inv
    return 0

data = [
    dict(name='alice', age=10), 
    dict(name='baruch', age=9), 
    dict(name='alice', age=11),
]

all_cmps = [
    [('name', 1), ('age', -1)], 
    [('name', 1), ('age', 1)], 
    [('name', -1), ('age', 1)],]

print 'data:', data
for cmps in all_cmps: print 'sort:', cmps; print sorted(data, cmpfun)

如@Claudiu对@monojohnny在本回答的评论部分所示,给出:

list_to_be_sorted = [
                      {'name':'Homer', 'age':39}, 
                      {'name':'Milhouse', 'age':10}, 
                      {'name':'Bart', 'age':10} 
                    ]

按关键字“age”、“name”对词典列表进行排序(如SQL语句ORDER BY age,name),可以使用:

newlist = sorted( list_to_be_sorted, key=lambda k: (k['age'], k['name']) )

或者,同样

import operator
newlist = sorted( list_to_be_sorted, key=operator.itemgetter('age','name') )

打印(新列表)

〔{‘name’:‘Bart’,‘age’:10},{‘ame’:‘Milhouse’,‘age’:10〕,{‘name’:‘Homer’,‘age’:39}〕

sorted()函数接受key=参数

newlist = sorted(list_to_be_sorted, key=lambda d: d['name']) 

或者,您可以使用operator.itemgetter而不是自己定义函数

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

为完整起见,添加reverse=True以降序排序

newlist = sorted(list_to_be_sorted, key=itemgetter('name'), reverse=True)

您可以使用自定义比较函数,也可以传入计算自定义排序键的函数。这通常更有效,因为每个项只计算一次键,而比较函数将被调用多次。

你可以这样做:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

但是标准库包含一个获取任意对象项的通用例程:itemgetter。因此,请尝试以下操作:

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))