• python基础:使用map处理数据


    之前在写echarts报表时,遇到一个处理数据的问题

    情况描述:

    折线图需要展示周一~周日的数据,但是从数据库查出来的数据却是类似这样的

    {'周一': 1, '周三': 5, '周四': 2}

    前端需要的数据是这样的:

    [{'周一': 1}, {'周二': 0}, {'周三': 5}, {'周四': 2}, {'周五': 0}, {'周六': 0}, {'周日': 0}]

    所以需要在程序中处理下,把那些数据为0的日期也放到数组中,并且按照顺序排列,这样折线图才能连贯起来,如下

    所以现在有一道题:

    给定一个 {日期: 数据} 数据字典,如 {'周一': 1, '周三': 5, '周四': 2},请补全里面缺失的日期,并且对应数据为0,

    期望输出:[{'周一': 1}, {'周二': 0}, {'周三': 5}, {'周四': 2}, {'周五': 0}, {'周六': 0}, {'周日': 0}]

    方法1:

    dict_value = {'周二': 1, '周三': 5, '周四': 2}
    print("*************打印dict_value*************")
    print(dict_value)
    
    week = {"周一": 0, "周二": 0, "周三": 0, "周四": 0, "周五": 0, "周六": 0, "周日": 0}
    
    week.update(dict_value)  # 使用update方法,把dict_value合并到week中,这样会把相同key的值更新(dict_value中的值取代week中相同key的值)
    print("*************打印week*************")
    print(week)
    
    statistics_data = []  # 定义一个空列表
        for t in week.items():  # 遍历week字典所有的键值对(每一个键值对会以元组的形式返回)
            statistics_data.append({ # 把元祖重新组合成字典后,追加到statustics中
                "name": t[0],
                "value": t[1]
            })
    print("*************statistics_data*************")
    print(statistics_data)

    方法2:

    def magic(x):
        week = {'周一': 0, '周二': 0, '周三': 0, '周四': 0, '周五': 0, '周六': 0, '周日': 0}
        for i in x:
            for key in week:
                if key == i:
                    week[key] = x[key]
        return week
    
    if __name__ == '__main__':
        dict_value = {'周二': 1, '周三': 5, '周四': 2}
        week = magic(dict_value)
        statistics_data = []
        for t in week.items():
            statistics_data.append({"name": t[0], "value": t[1]})
        print(statistics_data)

     magic函数接收一个参数,这个参数是一个字典

    外层for循环,遍历字典x(遍历字典时,会遍历其中的key)

    内层for循环遍历字典week,

    如果week某个元素的key=x某个元素的key,则把x[key]对应的值赋给week[key]

    这样就完成了数据的替换

    方法3: 打算使用map来实现

    首先定义一个函数

    def test(item: dict, origin_data: dict):
        item_key = list(item.keys())[0]
        if item_key in origin_data:
            item[item_key] = origin_data[item_key]
        else:
            item[item_key] = 0
        return item

    item 参数表示一个字典,只包含一个键值对 {key: value};

    origin_data 参数也表示一个字典,它包含多个键值对,它就是从数据库读出来的数据 ,如{'周二': 1, '周三': 5, '周四': 2};

    取出item的key,如果这个key在origin_data中,则用 origin_data对应key的value替换 item中的value;

    否则给item的值赋0;

    本来这是要往map中传的函数,但是有个问题,这个函数接收2个参数

    通过网上冲浪一番,找到了一个解决方法:使用偏函数

    import functools
    
    def test(item: dict, origin_data: dict):
        item_key = list(item.keys())[0]
        if item_key in origin_data:
            item[item_key] = origin_data[item_key]
        else:
            item[item_key] = 0
        return item
    
    if __name__ == '__main__':
    
        x = [{'周一': 0}, {'周二': 0}, {'周三': 0}, {'周四': 0}, {'周五': 0}, {'周六': 0}, {'周日': 0}]
        y = {'周一': 1, '周三': 5, '周四': 2}
        magic = functools.partial(test, origin_data=y)  # 偏函数
        t = map(magic, x) # 调用map方法
        print(list(t))

    使用 functools.partial 生成了一个偏函数,它接收一个函数,和一个固定的变量;

    然后调用map方法,把偏函数传入,这样magic函数会作用于x中的每组元素,一个流程下来就把x中的所有元素替换完成~

    
    
  • 相关阅读:
    软件测试相关面试
    GET和POST两种基本请求方法的区别
    Fiddler的安装与使用
    idea与eclipse项目相互导入的过程
    Selenium 学习笔记
    面试相关的案例
    idea编译启动报错
    window安装redis无法启动报错
    【001】接口测试-常用工具介绍和使用
    pyinstaller 打包exe相关
  • 原文地址:https://www.cnblogs.com/hanmk/p/15745805.html
Copyright © 2020-2023  润新知