基于模板合并多个列表 [英] Merge Multiple Lists of Lists Based on Template
问题描述
我有3个DB调用返回一个元组的元组,其名称,代码和计数如下:
I have 3 DB calls returning a tuple of tuples with a name, code and count like so:
year = (('Fanklin Grand Isle', '5560', 1), ('Windham', '3457', 1))
month = (('Fanklin Grand Isle', '5560', 1), ('Chittendon', '3367', 1))
week = (('Fanklin Grand Isle', '5560', 1), ('Chittendon', '3367', 1))
我需要将所有这些合并在一起,以便它们具有名称,代码以及每年,每月和每周的计数.
I need to merge these all together so that they will have the Name, code and count for yearly, monthly and weekly.
我的问题是,如果没有记录,我需要在"AND"中插入名称"和代码,并为计数添加0值.最终产品应类似于:
My problem is that if there is no record I need to insert the Name and code in AND a 0 value for the counts. The end product should be something like:
result = (('Windham', '0905', 1, 1, 0), ('Windsor Windham', '7852', 0, 0, 0), ('Washington', '3292', 0, 0, 0),
('Orleans Essex', '44072', 1, 1, 0), ('Addison', '2853', 0), ('Bennington', '3778', 0),
('Fanklin Grand Isle', '5560', 0, 0 0), ('Caledonia', '1992', 0, 0, 0),
('Rutland', '2395', 1, 0, 0), ('Chittendon', '3367', 1, 1, 0), ('Lamoille', '5229',0, 0 0))
我试图嵌套一个循环,以检查该名称是否存在于数据库调用和模板中.如果将DB值附加到列表中,如果不是,则附加0
I was trying to nest a loop to check if the name was present in the DB call and the template. IF if was append the DB value to the list, if not append 0
i = 0
for p in newlist:
try:
if p[0] == mlist[i][0]:
print("HERE: {} {}".format(p[0], mlist[i][0]))
p.append(mlist[i][-1])
i += 1
else:
p.append(0)
except IndexError:
continue
这是附加DB值,而不是零.我确信必须有一种更好的方法来做到这一点并使它真正发挥作用.
This is appending the DB value but not the zero. I am sure there must be a better way to do this and get it to actually work.
编辑
Edit
这是根据收到的答案更新的代码.对我而言,它仍将每个year
值替换为0.
Here is the updated code based on answers received. For me it is still replacing each year
value with a 0.
数据:
year = (('Fanklin Grand Isle', '5560', 1), ('Windham', '0905', 0), ('Windsor Windham', '7852', 0), ('Washington', '3292', 0), ('Orleans Essex', '44072', 0), ('Chittendon', '18028633367', 1), ('Addison', '12853', 0), ('Bennington', '3778', 0), ('Caledonia', '11992', 0), ('Rutland', '1895', 0), ('Chittendon', '18367', 0), ('Lamoille', '1809', 0), ('Windham', '180905', 0), ('Windsor Windham', '180852', 0), ('Waston', '18022623292', 0), ('Orleans Essex', '18072', 0), ('Addison', '1853', 0), ('Bennington', '1778', 0), ('Fanklin Grand Isle', '18560', 0), ('Caledonia', '180292', 0), ('Rutland', '195', 0), ('Lamoille', '18229', 0))
month = (('Fanklin Grand Isle', '5560', 1), ('Chittendon', '18028633367', 1))
week = (('Fanklin Grand Isle', '5560', 1), ('Chittendon', '18367', 1))
代码:
from collections import defaultdict
joined_data = defaultdict([0, 0, 0].copy)
for entry in year:
# we create the default entry by calling the defaultdict with a key
# and immediately grab the newly created list
count = joined_data[(entry[0],entry[1])]
# we swap *inplace* the value given by the DB query
count[0] = entry[2]
# rinse and repeat with the rest of the data
for entry in month:
count = joined_data[(entry[0], entry[1])]
count[1] = entry[2]
for entry in week:
count = joined_data[(entry[0], entry[1])]
count[2] = entry[2]
# Finally we format the data to the required format
result = tuple(key+tuple(value) for key,value in joined_data.items() )
print(result)
结果:
(('Fanklin Grand Isle', '5560', 0, 1, 1), ('Windham', '0905', 0, 0, 0), ('Windsor Windham', '7852', 0, 0, 0), ('Washington', '3292', 0, 0, 0), ('Orleans Essex', '1072', 0, 0, 0), ('Chittendon', '13367', 0, 1, 1), ('Addison', '2853', 0, 0, 0), ('Bennington', '1878', 0, 0, 0), ('Caledonia', '1992', 0, 0, 0), ('Rutland', '2395', 0, 0, 0), ('Lamoille', '5229', 0, 0, 0))
推荐答案
这是一种使用defaultdict
处理您的问题的方法,从而不必担心丢失的条目:
Here's a way to deal with your issue using a defaultdict
to avoid having to care about the missing entries :
year = (('Fanklin Grand Isle', '5560', 1), ('Windham', '3457', 1))
month = (('Fanklin Grand Isle', '5560', 1), ('Chittendon', '3367', 1))
week = (('Fanklin Grand Isle', '5560', 1), ('Chittendon', '3367', 1))
#I'm using a defaultdict to deal with the missing entries
from collections import defaultdict
joined_data = defaultdict([0,0,0].copy)
for entry in year:
#we create the default entry by calling the defaultdict with a key
#and immediately grab the newly created list
count = joined_data[(entry[0],entry[1])]
#we swap *inplace* the value given by the DB query
count[0] = entry[2]
#rinse and repeat with the rest of the data
for entry in month:
count = joined_data[(entry[0],entry[1])]
count[1] = entry[2]
for entry in week:
count = joined_data[(entry[0],entry[1])]
count[2] = entry[2]
#Finally we format the data to the required format
result = tuple(key+tuple(value) for key,value in joined_data.items() )
print(result)
输出:
>>>(('Chittendon', '3367', 0, 1, 1), ('Fanklin Grand Isle', '5560', 1, 1, 1), ('Windham', '3457', 1, 0, 0))
这篇关于基于模板合并多个列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!