Itertools zip_longest,每个子列表的第一项作为填充值,而不是默认情况下为None

问题描述 投票:4回答:1

我有此列表列表:

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', '', '')]

[fillvalue函数的参数zip_longest是否还有其他过程(例如映射任何函数或类似的东西),这样我就不必遍历列表来填充每个子列表的长度为最长的子列表,然后可以只用zip_longest行完成此操作?

我有此列表清单:cont_det = [['TASU 117000 0',“ TGHU 759933-0”,'CSQU3054383','BMOU 126780-0',“ HALU 2014 13 3”],['40HS' ],['危险材料','Arm5 Maehinery']]实际上...

python python-3.x list itertools
1个回答
0
投票

看起来像某种“矩阵旋转”。

© www.soinside.com 2019 - 2024. All rights reserved.