将列表与列表中不同长度的列表相结合
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']]]
【讨论】:
以上是关于将列表与列表中不同长度的列表相结合的主要内容,如果未能解决你的问题,请参考以下文章