将列表与列表中不同长度的列表合并 [英] Combine a list with a list of varied length within a list

查看:26
本文介绍了将列表与列表中不同长度的列表合并的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试结合历史数据,这些数据来自一个古老的定制电子邮件系统,用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 Chain:

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"]]]

这篇关于将列表与列表中不同长度的列表合并的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆