我有一个db查询返回三组数据。它采用这种格式。
year = (('Adison', '355', 4), ('windsor windham', '455', 6), ('windham', '655', 2), ('btown', '233', 5))
month = (('Adison', '355', 2), ('windham', '655', 1))
week = (('btown', '233', 8), ('Adison', '355', 9))
年份列表总是最长,价值最多。我需要从月份和周列表中的每个元素中取出最后一个值,并根据城镇将它们附加到适当位置的年份列表中。
如果月或周没有相应的值,我需要附加一个0.理想情况下看起来像这样:
year = (('Adison', '355', 4, 2, 9), ('windsor windham', '455', 6, 0, 0), ('windham', '655', 2, 1, 0), ('btown', '233', 5, 0, 8))
我已经尝试将两个列表放在for循环中并使用if in
条件来检查值,但我认为我忽略了某些内容并且遇到了索引错误。我试过这样的事情:
for each in year:
for part in month:
if part in each:
each.append(part[-1])
else:
each.append(0)
我知道必须有一种更好的方法,而且实际上可以实现这一目标。我应该研究一下工具或模块吗?我和zip
一起玩过但是因为它们长度不一样我遇到了麻烦。谢谢!
修改
我知道上面有元组,在我的代码中,在修改之前将它们全部转换为列表对象。我也在使用Python 3.6
答案 0 :(得分:2)
您可以从month
和week
元组构建dicts并从中获取值,以创建附加新值的新 sub -tuples。使用dict.get(..., 0)
可以为没有月份或周数据的城市设置默认值0:
dct_mth = {k: v for k, _, v in month}
dct_week = {k: v for k, _, v in week}
year = list(year) # make container mutable
for i, yr in enumerate(year):
year[i] += (dct_mth.get(yr[0], 0), dct_week.get(yr[0], 0))
print(year)
# [('Adison', '355', 4, 2, 9), ('windsor windham', '455', 6, 0, 0), ('windham', '655', 2, 1, 0), ('btown', '233', 5, 0, 8)]
答案 1 :(得分:0)
首先,键入前两个元素的dict,使用零作为月和周的默认值。然后在必要时填写月份和周:
data = {(name, n): [y, 0, 0] for name, n, y in year}
for name, n, m in month:
data[name, n][1] = m
for name, n, w in week:
data[name, n][2] = w
data = tuple(tuple([*k, *v]) for k, v in data.items())
答案 2 :(得分:0)
这有用吗?
year = [['Adison', '355', 4],['windsor windham', '455', 6],
['windham', '655', 2],['btown', '233', 5]]
month = [['Adison', 355, 2],['windham', '655', 1]]
week = [['btown', '233', 8],['Adison', '355', 9]]
for y in year:
for m in month:
if y[0] == m[0]:
y.append(m[-1])
for w in week:
if y[0] == w[0]:
y.append(w[-1])
for each in year:
print(each)
[' Adison',' 355',4,2,9]
[' windsor windham',' 455',6]
[' windham',' 655',2,1]
[' btown',' 233',5,8]
答案 3 :(得分:0)
下面的代码首先将数据转换为dicts,然后合并来自月份和数据的数据。本周决定进入年度。最后,它将组合数据转换为元组列表。
我正在使用dicts,因为通过dict中的键查找项目要快得多,而不是逐项扫描列表或元组,寻找匹配项。当只有少数项目时,它没有太大的区别,但如果你的真实数据有几十个或几百个城镇,那么速度差异就会很大。
我假设城镇名称后面的数字是某种ID代码,这样我们就可以拥有多个同名但不同ID号的城镇。因此我的dicts使用名称和那个数字作为关键。
year = (('Adison', '355', 4), ('windsor windham', '455', 6), ('windham', '655', 2), ('btown', '233', 5))
month = (('Adison', '355', 2), ('windham', '655', 1))
week = (('btown', '233', 8), ('Adison', '355', 9))
# Convert a nested tuple to a dict, using the first 2 fields
# in the tuple as the key and the last field as the value.
def make_dict(seq):
return {u[:-1]: [u[-1]] for u in seq}
year = make_dict(year)
month = make_dict(month)
week = make_dict(week)
# Add the month & week data to the year data
for k in year:
year[k] += month.get(k, [0]) + week.get(k, [0])
print(year)
# Convert the updated year dict to a list of tuples
data = []
for k, v in year.items():
data.append(k + tuple(v))
for row in data:
print(row)
<强>输出强>
{('Adison', '355'): [4, 2, 9], ('windsor windham', '455'): [6, 0, 0], ('windham', '655'): [2, 1, 0], ('btown', '233'): [5, 0, 8]}
('Adison', '355', 4, 2, 9)
('windsor windham', '455', 6, 0, 0)
('windham', '655', 2, 1, 0)
('btown', '233', 5, 0, 8)
如果您希望data
成为元组的元组,请执行data = tuple(data)
。 OTOH,dict形式可能比列表更有用。