列表的多個列表我有3個DB調用返回同一個名稱,代碼元組的元組和計數,像這樣:合併基於模板
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))
我需要將這些全部合併在一起,以便他們擁有姓名,代碼並計算每年,每月和每週的計數。
我的問題是,如果沒有記錄,我需要插入名稱和代碼和計數的0值。最終產品應該是這樣的:
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調用和模板。如果如果將DB值附加到列表中,如果不附加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值但不是零。我相信必須有更好的方式來做到這一點,並讓它實際工作。
編輯
這是根據接收到的答案更新的代碼。對我來說,它仍然是一個0
數據替換每個year
值:
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))
當然,所有這些城市獲得了'0'因爲如果一年一年-count在您的「年份」列表中爲「0」。你期望輸出什麼,爲什麼? –
對不起tobias並不意味着編輯您的文章,意味着編輯我 – Joe