【发布时间】:2019-12-10 21:05:58
【问题描述】:
我有这份清单:
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', '', '')]
是否有任何其他过程(例如映射任何函数左右)到zip_longest 函数的参数fillvalue,这样我就不必遍历列表来填充每个子列表的长度在那之前最长的子列表中,这件事可以在一行中完成,只有zip_longest?
【问题讨论】:
-
这是一个巧妙的拼图。您的解决方案唯一可能的限制是它需要预先设置长度,这使得 zip_longest 和 pad 毫无意义。除此之外,我喜欢它。
标签: python python-3.x list itertools