如何在Python中按字典值对字典列表进行排序?
时间:2020-03-05 18:56:06 来源:igfitidea点击:
我得到了一个字典列表,并希望按该字典的值对其进行排序。
这
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
按名称排序,应成为
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
解决方案
回答
我们必须实现自己的比较功能,该功能将通过名称键的值比较字典。请参阅从PythonInfo Wiki对Mini-HOW TO进行排序
回答
我想你的意思是:
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
排序如下:
sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))
回答
my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}] my_list.sort(lambda x,y : cmp(x['name'], y['name']))
现在," my_list"将成为我们想要的。
(3年后)进行编辑以添加:
新的" key"参数更有效,更整洁。更好的答案现在看起来像:
my_list = sorted(my_list, key=lambda k: k['name'])
... IMO的lambda比operator.itemgetter
更容易理解,但是YMMV。
回答
使用密钥而不是cmp看起来更干净:
newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])
或者正如塞巴斯蒂安(J.F. Sebastian)和其他人所建议的那样,
from operator import itemgetter newlist = sorted(list_to_be_sorted, key=itemgetter('name'))
为了完整起见(如fitzgeraldsteele的评论中所指出),添加reverse = True
对降序进行排序
newlist = sorted(l, key=itemgetter('name'), reverse=True)
回答
import operator a_list_of_dicts.sort(key=operator.itemgetter('name'))
'key'用于按任意值排序,'itemgetter'将该值设置为每个项目的'name'属性。
回答
我们可以使用自定义比较函数,也可以传入一个计算自定义排序键的函数。通常这样做效率更高,因为每个项只计算一次密钥,而比较函数将被调用多次。
我们可以这样进行:
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'))
回答
import operator
要按key ='name'对词典列表进行排序:
list_of_dicts.sort(key=operator.itemgetter('name'))
要按key ='age'对字典列表进行排序:
list_of_dicts.sort(key=operator.itemgetter('age'))
回答
这是我对有关按多列排序的一个相关问题的回答。它也适用于简并情况,即列数仅为一。
回答
如果要按多个键对列表进行排序,则可以执行以下操作:
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']))
它相当骇人,因为它依赖于将值转换为单个字符串表示形式进行比较,但是它对于包括负数在内的数字也可以按预期工作(尽管如果使用数字,则需要使用零填充来适当格式化字符串)