在Python中如何按字典某个值和字母顺序对字典列表进行排序?
好的,我来解释一下我想做的事情……我知道用itemgetter()可以很简单地按字母顺序排序,但如果我有这样的数据:
[{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]
我想按名字的字母顺序排序,并且还要加个条件,就是名字为'TOTAL'的那一项要排在最后,结果应该是这样的:
[{'Name':'ABC Company', 'Rank':20}, {'Name':'Woo Company', 'Rank':15}, {'Name':'TOTAL', 'Rank':100}]
那我该怎么做呢?
4 个回答
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}]
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}]
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
10
这里最好的方法是给排序的关键字加点装饰... 在Python中,元组会按照里面的元素顺序进行排序,所以我们可以用一个元组来作为排序的关键字,里面放入你想要的排序标准:
sorted(list_of_dicts, key=lambda d: (d['Name'] == 'TOTAL', d['Name'].lower()))
这样就得到了以下的排序关键字:
- 对于 {'Name': 'TOTAL', 'Rank': 100},排序关键字是 (True, 'total')
- 对于 {'Name': 'Woo Company', 'Rank': 15},排序关键字是 (False, 'woo company')
- 对于 {'Name': 'ABC Company', 'Rank': 20},排序关键字是 (False, 'abc company')
因为在排序时,False 会排在 True 前面,所以那些名字不是 TOTAL 的项会先被放在一起,然后再按字母顺序排序,最后 TOTAL 会被放在最后面。