之前在写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中的所有元素替换完成~