这几天有个需求,dict里面key是转成字符串的日期,然后需要对dict里面的key值,按照日期大小进行排序,搜了一下没有什么好的办法,借鉴了一下java的思路,写了一个对Python里面的dict字典的key键,按照自定义的方法进行排序,排序完成后返回排序好的dict。
1、先写一个排序器,用于比较两个键谁大谁小,这里就是实现key排序的关键方法。
此处为rankDate,用于日期排序,需要配合strtodate把字符串转为时间先。
2、排序方法,传入需要排序的字典、排序方法、顺序为降序或升序
import datetime
# 你不一定需要此方法,只是我用来配合字符串日期比较大小用的
def strtodate(time: str):
"""
把字符串str转为日期date
:param time:需要转换的字符串
:return:转换后的时间
"""
return datetime.datetime.strptime(time, "%Y.%m.%d")
def rankDate(d1: str, d2: str) -> bool:
"""
对两个str安装需要的方法比较大小,此处替换成你需要的排序方法
:param d1: 第一个值
:param d2: 第二个值
:return: True:第一个值比第二个值大;False:第一个值比第二个值小
"""
dd1 = strtodate(d1)
dd2 = strtodate(d2)
if dd1 > dd2:
return True
else:
return False
def sortDictByKey(d: dict, method=rankDate, ASC=False) -> dict:
"""
传入一个字典,然后按字典的key键,使用指定的方法进行排序
:param d: 需要排序的字典
:param method: 排序方法
:param ASC: 默认为降序,如需升序则为True
:return: 排序好的字典
"""
newDict = {}
sortedKeysList = []
for i in d.keys():
if len(sortedKeysList) == 0:
sortedKeysList.append(i)
else:
isInsert = False
for j in range(len(sortedKeysList)):
if method(i, sortedKeysList[j]):
sortedKeysList.insert(j, i)
isInsert = True
break
if isInsert: continue
sortedKeysList.append(i)
if ASC:
sortedKeysList.reverse()
for i in sortedKeysList:
newDict[i] = d[i]
return newDict
3、使用方法:复制以上代码,然后
oldDict = {
'2019.01.01': '1',
'2019.01.03': '3',
'2019.01.02': '2',
'2019.01.04': '4',
}
newDict = sortDictByKey(oldDict, rankDate)
# rankDate为排序方法
print(newDict)
# 打印结果:{'2019.01.04': '4', '2019.01.03': '3', '2019.01.02': '2', '2019.01.01': '1'}