Python实现对dict的key使用自定义方法进行排序

这几天有个需求,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'}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值