记录一下去年刚工作时写的第一个对我来说有点难度的算法。
要求是这样的,通过对加油站统计上来的已有加油机设备表和计划增加加油机设备表合并以求得各个加油站的未来总机器维护数量,在通过前面的脚本操作已将两表数据读出后根据city的值已经做好排序,然后读出数据获得下面展示的演示数据。
[{'addr': '天津市', 'city': '南开区', 'name': '天津市南开区天拖加油站', 'jiusan': 2, 'jiuba': 2, 'chaiyou': 1,'shijianduan': '00:00~24:00', 'fuwuduan': '00:00~24:00',
'zhifu': '加油宝APP', 'detail_addr': '天津市市辖区南开区天拖101号天拖加油站'},{'addr': '天津市', 'city': '南开区', 'name': '天津市南开区天拖加油站', 'jiusan': 2, 'jiuba': 4, 'chaiyou': 1,'shijianduan': '00:00~24:00', 'fuwuduan': '00:00~24:00','zhifu': '加油宝APP', 'detail_addr': '天津市市辖区南开区天拖101号天拖加油站'},{'addr': '天津市', 'city': '河西区', 'name': '天津市河西区梅江会展加油站', 'jiusan': 5, 'jiuba': 5, 'chaiyou': 2,'shijianduan': '00:00~24:00', 'fuwuduan': '00:00~24:00','zhifu': '加油宝APP', 'detail_addr': '天津市河西区梅江1034号梅江会展加油站'},
。。。。。。后续几百条数据,数据已从业务数据脱敏,展示数据全部为虚假数据}]
元素之间已经排序过,相同的元素会紧邻,需要对list-dict数据对每一个元素中的city进行比较,将city的值相同的元素中加油机的数量相加,最后只保留一条总的记录,存为list-list的结构用于后续的操作,如下面所示
[['天津市', '南开区', '天津市南开区天拖加油站', 4, 6, 2, '00:00~24:00','00:00~24:00','加油宝APP', '天津市市辖区南开区天拖101号天拖加油站'],.....]
为了满足这个需求,首先拿出每个元素的key_list和value_list
k1 = []
v1 = []
for x in range(len(dic1)):
k1.append(list(dic1[x].keys()))
v1.append(list(dic1[x].values()))
然后使用比key加值的操作
q1 = []
r = 0
for i in range(len(v1)):
if i == 0:
q1.append(v1[i])
continue
if v1[i][1] == q1[r][1]:
q1[r][3] += v1[i][3]
q1[r][4] += v1[i][4]
q1[r][5] += v1[i][5]
continue
else:
q1.append(v1[i])
r += 1
print(q1)
形象的起名为出租车算法,本质其实是key和value的相对取值,判断v1[n][1]是否相等,当条件满足,将v1[n][3-5]的值进行相加 先准备第一辆“车”,然后先让第一个数据上“车”,然后指明一个“地址”,然后来第二个数据,第二个数据如果它的“目的地”与上一个地址“目的地”一样,则"上车",并且相应值进行相加 如果第二个数据如果它的“目的地”与上一个地址“目的地”不一样,则"车"开走,即保存在q1中
但这只适用于已经进行过排序的list-dict,对于没有排序的需要先进行排序或使用递减双遍历来实现效果。