我有一个列表的列表:
cont_det = [['TASU 117000 0', "TGHU 759933 - 0", 'CSQU3054383', 'BMOU 126 780-0', "HALU 2014 13 3"], ['40HS'], ['Ha2ardous Materials', 'Arm5 Maehinery']]
实际上,
cont_det
是一个巨大的列表,其中包含许多具有不规则长度的子列表。这只是一个演示样例。我想获得以下输出:[['TASU 117000 0', '40HS', 'Ha2ardous Materials'],
['TGHU 759933 - 0', '40HS', 'Arm5 Maehinery'],
['CSQU3054383', '40HS', 'Ha2ardous Materials'],
['BMOU 126 780-0', '40HS', 'Ha2ardous Materials'],
['HALU 2014 13 3', '40HS', 'Ha2ardous Materials']]
这里的逻辑是对列表中的所有子列表进行
zip_longest
操作,但如果有任何一个子列表的长度小于所有子列表的最大长度(即第一个子列表的长度为5),则不使用默认值fillvalue=None
,而是取该子列表的第一个项目作为填充值。例如在第二个子列表中,所有填充值都相同,在第三个子列表中,最后三个填充值由第一个值填充。我使用以下代码得到了结果:
from itertools import zip_longest as zilo
from more_itertools import padded as pad
max_ = len(max(cont_det, key=len))
for i, cont_row in enumerate(cont_det):
if len(cont_det)!=max_:
cont_det[i] = list(pad(cont_row, cont_row[0], max_))
cont_det = list(map(list, list(zilo(*cont_det))))
这样做会得到我期望的结果。如果我使用
list(zilo(*cont_det, fillvalue=''))
,那么就会得到这个结果:[('TASU 117000 0', '40HS', 'Ha2ardous Materials'),
('TGHU 759933 - 0', '', 'Arm5 Maehinery'),
('CSQU3054383', '', ''),
('BMOU 126 780-0', '', ''),
('HALU 2014 13 3', '', '')]
< p>是否有任何其他方式(例如映射任何函数等)来填充zip_longest
函数的参数fillvalue
,以便我不必通过迭代列表来将每个子列表填充到比它之前最长的子列表长度,并且可以在只使用zip_longest
一行完成此操作?