python基础:使用map处理数据

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

情况描述:

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

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

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

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

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

python基础:使用map处理数据

 

 

所以现在有一道题:

给定一个 {日期: 数据} 数据字典,如 {'周一': 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中的所有元素替换完成~


上一篇:SAS intnx函数处理时间


下一篇:踩坑:java时间格式化yyyy与YYYY的区别