如何按特定键的值对词典列表进行排序?鉴于:
[{'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}]
当前回答
按多个列排序,其中一些列按降序排序: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}〕
这是另一种通用解决方案——它按键和值对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)
sorted(A, key=sort_key_func)
有时我们需要使用lower()进行不区分大小写的排序。例如
lists = [{'name':'Homer', 'age':39},
{'name':'Bart', 'age':10},
{'name':'abby', 'age':9}]
lists = sorted(lists, key=lambda k: k['name'])
print(lists)
# Bart, Homer, abby
# [{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}, {'name':'abby', 'age':9}]
lists = sorted(lists, key=lambda k: k['name'].lower())
print(lists)
# abby, Bart, Homer
# [ {'name':'abby', 'age':9}, {'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
假设我有一本字典D,其中包含以下元素。要排序,只需使用sorted中的key参数传递自定义函数,如下所示:
D = {'eggs': 3, 'ham': 1, 'spam': 2}
def get_count(tuple):
return tuple[1]
sorted(D.items(), key = get_count, reverse=True)
# Or
sorted(D.items(), key = lambda x: x[1], reverse=True) # Avoiding get_count function call
看看这个。
import operator
要按key='name'对词典列表进行排序:
list_of_dicts.sort(key=operator.itemgetter('name'))
要按key='age'对词典列表进行排序,请执行以下操作:
list_of_dicts.sort(key=operator.itemgetter('age'))