python3 字典dict的综合运用(这是一段意外写出来的程序代码)

介绍

计划和媳妇去云南旅游,媳妇让做一下预算,正好当时正在写python代码,就随手一个print(sum([…]))计算了出来,后来媳妇说分分类,有些是确定的,有些无法确定,就又加了些逻辑进去,媳妇称赞的同时又灵魂一击:一个计算器不就解决了吗?哈哈哈,最后本着“杀鸡用牛刀”的目的,又花了些时间完善了一下代码逻辑和注释。
该小段代码主要用了字典dict、求和sum()以及逻辑判断,既然写了就发出来,说不定可以帮助到某位同学呢(大牛大神们请绕开,不敢班门弄斧U_U),另外需要说明的是,该代码中的字典只是为了应用,所以不包含字典的所有用法。

源码

# 根据费项计算总费用
def sumFees(fees):
    '''
    参数说明:
        1、fees为一个两层级的字典,外层字典的value必须为字典格式,否则会被忽略
        2、内层的字典的value必须为数字,否则可能会强制转为0
        3、内层的字典的value如果为负数,也会正常进行运算
    
    示例格式:
        fees = {
            '机票': {'北京 >>> 昆明': 803*2, '丽江 >>> 郑州': 900*2},
            '住宿': {'大理古城': 300, '大理市区': 200, '丽江': 588, 'y郑州': 150*4},
            '租车': {'大理': 135},
            '铁路': {'昆明 >>> 大理': 145*2, '大理 >>> 丽江': 49*2, '郑州 >>> 北京': 309*2},
            '门票': {'苍山景区': 290*2, '环洱海景点': 200*2, 'y丽江千古情': 230*2, 'y玉龙雪山': 438},
            '餐食': {'大理': 1000, 'y丽江': 1087, 'y郑州':879},
            '购物': {'大理': 2000, 'y丽江': 1500},
            '其他': {'y公共交通': 40*2+20*2+6*2+20*2, '租车油费':76, '保险':20*2+12*2}
        }
    '''
    # 如果传参不是字典类型,直接处理
    if not isinstance(fees, dict):
        print('传参不是字典类型,请重新设置!')
        return ''

    # 定义空字典,供后面使用
    noConfirm = {
   }  # 预估费用明细
    confirmed = {
   }  # 确定费用明细
    totalFees = {
   }  # 总费用明细
    totalFeesConfirmed = {
   }  # 确定总费用明细
    totalFeesNoConfirm = {
   }  # 预估总费用明细

    # 第一个for循环:处理外层字典
    for item in fees:
        itemValueTem = fees[item]
        temDict1 = {
   }
        temDict2 = {
   }

        #判断外层字典的value是否为字典
        if isinstance(itemValueTem, dict):
            # 第二个for循环:处理内层字典
            for item2 in itemValueTem:
                itemValue = itemValueTem[item2]
                # 判断内层字典的value是否为数值,如果不是数值,则强制转换为浮点数,转换失败则强制赋值为0
                if not isinstance(itemValue, (int, float)):
                    try:
                        itemValue = float(itemValue)
                    except:
                        itemValue = 0

                # 如果内层字典的key的第一个字符为“y”,则记为预估费用项,否则记为确定费用项
                if item2[0:1].lower() == 'y':
                    temDict1[item2] = itemValue
                else:
                    temDict2[item2] = itemValue

            # 只有临时预估费用和临时确定费用不为空的时候才进入到noConfirm和confirmed
            if temDict1:
                noConfirm[item] = temDict1
            if temDict2:
                confirmed[item] = temDict2
        else:
            print('%s 的参数设置错误,必须为dict类型!' % (item,))

    # 确定费用项不为空时,处理确定费用项
    if confirmed:
        for item3 in confirmed:
            # 获取各确定费用项的value,返回一个列表
            feeTem3 = confirmed[item3].values()

            # 如果列表feeTem3不为空则计算确定总费用,并进入到totalFees和totalFeesConfirmed中
            if feeTem3:
                item3Sum = sum(feeTem3)
                totalFees[item3] = item3Sum
                totalFeesConfirmed[item3] = item3Sum
                # print('%s 的确定总费用为 %s 元' %(item3, str(item3Sum)))

    # 预估费用项不为空时,处理预估费用项
    if noConfirm:
        for item4 in noConfirm:
            # 获取各预估费用项的value,返回一个列表
            feeTem4 = noConfirm[item4].values()

            # 如果列表feeTem4不为空则计算预估总费用,并进入到totalFees和totalFeesNoConfirm中
            if feeTem4:
                item4Sum = sum(feeTem4)
                # print('%s 的预估总费用为 %s 元' %(item4, str(item4Sum)))
                totalFeesNoConfirm[item4] = item4Sum
                if item4 not in totalFees:
                    totalFees[item4] = item4Sum

                # 如果预估费用项在总费用中已存在(内层字典中有确定费用也有预估费用),则和已存在的数据相加求和后再赋值
                else:
                    totalFees[item4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值