如何按特定键的值对词典列表进行排序?鉴于:
[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
按名称排序时,应为:
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
如何按特定键的值对词典列表进行排序?鉴于:
[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
按名称排序时,应为:
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
当前回答
import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))
“key”用于按任意值排序,“itemgetter”将该值设置为每个项的“name”属性。
其他回答
my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
my_list.sort(lambda x,y : cmp(x['name'], y['name']))
my_list现在将是您想要的。
或者更好:
自从Python2.4以来,有一个关键的论点更高效、更整洁:
my_list = sorted(my_list, key=lambda k: k['name'])
…lambda比operator.itemgetter更容易理解,但您的里程数可能会有所不同。
您可以使用自定义比较函数,也可以传入计算自定义排序键的函数。这通常更有效,因为每个项只计算一次键,而比较函数将被调用多次。
你可以这样做:
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'))
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)
如果要按多个键对列表进行排序,可以执行以下操作:
my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))
它相当粗糙,因为它依赖于将值转换为单个字符串表示形式进行比较,但对于包括负数在内的数字,它的工作方式与预期一样(尽管如果使用数字,则需要使用零填充来适当地格式化字符串)。
按多个列排序,其中一些列按降序排序: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)