将列表与列表中不同长度的列表组合

Combine a list with a list of varied length within a list

我正在尝试结合来自一个古老的定制电子邮件系统的历史数据来创建一个具有 Python 的数据库。一个列表 (b) 包含电子邮件 ID,另一个列表 (a) 包含附件的文件名。一封电子邮件可能有零个、一个或多个附件。有数千条记录要处理。

我提取了以下格式的数据:

a = [[], ['a'], ['b', 'c', 'd']]
b = ['c1', 'c2', 'c3']

我想去掉'a'里面的空数据,剩下的数据格式如下,不管是列表还是元组。

x = [[['c2', 'a'], [['c3', 'b'], ['c3', 'c'], ['c4', 'd']]]

我试过使用 zip

x = zip(b, a)

但这添加到每个

的开头
(('c1', []), ('c2', ['a']), ('c3', ['b', 'c', 'd']))

我尝试了 itertools 链:

op = [list(itertools.chain(*i))
      for i in zip(b, a)]

但这产生了:

[['c', '1'], ['c', '2', 'a'], ['c', '3', 'b', 'c', 'd']]

我也曾尝试使用 re.findall() 将数据转换为更有用的格式,但电子邮件 ID 与文件名的数量通常不匹配。有很多关于列表和连接等的内容,但我没有发现任何关于列表中的列表的有用信息,其中列表中的长度是可变的。

我希望我理解你的问题(在你的输出中你有 c4 但我认为它应该是 c3):

a = [[], ["a"], ["b", "c", "d"]]
b = ["c1", "c2", "c3"]

out = [[[v, s] for s in l] for v, l in [t for t in zip(b, a) if t[1]]]
print(out)

打印:

[[["c2", "a"]], [["c3", "b"], ["c3", "c"], ["c3", "d"]]]

具有有意义的名称(并且没有 Andrej 莫名其妙的额外理解;-):

attachment_lists = [[], ['a'], ['b', 'c', 'd']]
emails = ['c1', 'c2', 'c3']

result = [[[email, attachment] for attachment in attachments]
          for email, attachments in zip(emails, attachment_lists)
          if attachments]

print(result)

输出(Try it online!):

[[['c2', 'a']], [['c3', 'b'], ['c3', 'c'], ['c3', 'd']]]