好的,这就是我要做的...我知道itemgetter()排序可以按字母排序很容易,但如果我有这样的东西:
[{'Name':'TOTAL','Rank':100}, {'姓名':'Woo公司','排名':15}, {'姓名':'ABC公司','排名':20}]
我希望按字母顺序排序(按名称)+包括条件:名称:'TOTAL'应该在序列的最后列出,如下所示:
[{'姓名':'ABC公司','排名':20}, {'姓名':'Woo公司','排名':15}, {'姓名':'总计','排名':100}]
我该怎么做?
答案 0 :(得分:10)
这里最好的方法是装饰排序键... Python将按元组顺序对元组进行排序,因此使用排序标准构建元组键:
sorted(list_of_dicts, key=lambda d: (d['Name'] == 'TOTAL', d['Name'].lower()))
这会产生一个排序键:
由于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')