在Python中,如何按字典的某个值+按字母顺序对字典列表进行排序?

时间:2009-05-22 16:33:28

标签: python list sorting dictionary

好的,这就是我要做的...我知道itemgetter()排序可以按字母排序很容易,但如果我有这样的东西:

  

[{'Name':'TOTAL','Rank':100},   {'姓名':'Woo公司','排名':15},   {'姓名':'ABC公司','排名':20}]

我希望按字母顺序排序(按名称)+包括条件:名称:'TOTAL'应该在序列的最后列出,如下所示:

  

[{'姓名':'ABC公司','排名':20},   {'姓名':'Woo公司','排名':15},   {'姓名':'总计','排名':100}]

我该怎么做?

4 个答案:

答案 0 :(得分:10)

这里最好的方法是装饰排序键... Python将按元组顺序对元组进行排序,因此使用排序标准构建元组键:

sorted(list_of_dicts, key=lambda d: (d['Name'] == 'TOTAL', d['Name'].lower()))

这会产生一个排序键:

  • (真,'总'){'姓名':'总计','排名':100}
  • (False,'woo company'){'Name':'Woo Company','Rank':15}
  • (假,'abc公司'){'姓名':'ABC公司','排名':20}

由于False早于True排序,名称不是TOTAL的那些将一起结束,然后按字母顺序排序,TOTAL将在结尾处结束。

答案 1 :(得分:1)

>>> lst = [{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]
>>> lst.sort(key=lambda d: (d['Name']=='TOTAL',d['Name'].lower()))
>>> print lst
[{'Name': 'ABC Company', 'Rank': 20}, {'Name': 'Woo Company', 'Rank': 15}, {'Name': 'TOTAL', 'Rank': 100}]

答案 2 :(得分:0)

使用排序的key参数或已排序。

例如:

dicts = [
     {'Name':'TOTAL', 'Rank':100}, 
     {'Name':'Woo Company', 'Rank':15},
     {'Name':'ABC Company', 'Rank':20}
]

def total_last(d):
    if d['Name'] == 'TOTAL':
        return '\xff\xff\xff\xff\xff\xff'
    return d['Name'].lower()

import pprint
pprint.pprint(sorted(dicts, key = total_last))

>python sort_dict.py
[{'Name': 'ABC Company', 'Rank': 20},
 {'Name': 'Woo Company', 'Rank': 15},
 {'Name': 'TOTAL', 'Rank': 100}]

答案 3 :(得分:-1)

好吧,我会使用list的排序方法对它进行多次传递排序。

list = [{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]

list.sort(key = lambda x: x['Name']) # Sorted by Name, alphabetically

list.sort(key = lambda x: 'b' if x['Name'] == 'TOTAL' else 'a')