合并来自不同长度的多个列表的数据

时间:2017-07-25 12:36:51

标签: python list loops python-3.6

我有一个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

4 个答案:

答案 0 :(得分:2)

您可以从monthweek元组构建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形式可能比列表更有用。