首页 > 解决方案 > 如何填写“锯齿状”列表?

问题描述

我有以下“锯齿状”python 列表:

lst = [[1, 'a', 2], ['b', 'c', 'd', 3, 4, 5], ['e']]

我想用 0 填充此列表中的“缺失”值,以便结果是矩形数组:

[[1, 'a', 2, 0, 0, 0],
 ['b', 'c', 'd', 3, 4, 5],
 ['e', 0, 0, 0, 0, 0]]

做这个的最好方式是什么?

标签: pythonlist

解决方案


使用itertools.zip_longest,然后重新压缩结果

>>> lst = [[1, 'a', 2], ['b', 'c', 'd', 3, 4, 5], ['e']]
>>> from itertools import zip_longest
>>> [list(x) for x in zip(*zip_longest(*lst, fillvalue=0))]
[[1, 'a', 2, 0, 0, 0], ['b', 'c', 'd', 3, 4, 5], ['e', 0, 0, 0, 0, 0]]

zip(*t)是转置列表列表的著名习语;同样的技巧适用于zip_longest. 由于转置的转置是原始列表,因此这会将每个子列表填充到所需的长度。


更详细地说,

>>> list(zip_longest(*lst, fillvalue=0))
[(1, 'b', 'e'), ('a', 'c', 0), (2, 'd', 0), (0, 3, 0), (0, 4, 0), (0, 5, 0)]

在这里你可以看到第一个元素的元组,然后是第二个元素的元组,等等。当给定的子列表0中没有第一个元素时使用。i


推荐阅读