這幾天有個需求,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'}