基于模板合并多个列表 [英] Merge Multiple Lists of Lists Based on Template

查看:68
本文介绍了基于模板合并多个列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆