将列表与列表中不同长度的列表相结合

Posted

技术标签:

【中文标题】将列表与列表中不同长度的列表相结合【英文标题】:Combine a list with a list of varied length within a list 【发布时间】:2021-09-30 09:59:05 【问题描述】:

我正在尝试将来自古代定制电子邮件系统的历史数据结合起来,用 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 数量。有很多关于列表和加入等的东西,但是我没有发现任何关于列表中可变长度的列表的有用信息。

【问题讨论】:

【参考方案1】:

我希望我正确理解了你的问题(在你的输出中你有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"]]]

【讨论】:

【参考方案2】:

有有意义的名字(并且没有 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']]]

【讨论】:

以上是关于将列表与列表中不同长度的列表相结合的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将不同长度的列表分解成行

实际参数列表和形式参数列表的长度错误不同

将不同长度的列表添加到新数据帧

JAVA继承问题,实际参数列表与形式参数列表长度不同怎么解决

使用R语言将不同长度的向量合并为数据框

从包含不同长度子列表的列表中构造所有组合