📅  最后修改于: 2023-12-03 14:52:50.379000             🧑  作者: Mango
在 Python 中,我们可以使用列表来存储一系列数据。但是,有时候我们可能会遇到这样的情况:我们有一个由多个列表组成的列表,每个列表的大小可能不同,我们想要将它们打破成一系列相同大小的块。
下面介绍三种方法来打破列表大小不等的块。
可以使用 itertools 模块中的 zip_longest 函数来完成这个任务。这个函数可以同时迭代多个可迭代对象,并且可以设置填充值。如果将填充值设置为 None,则可以在最短的可迭代对象用完之后继续迭代,而不会抛出 StopIteration 异常。
下面是一个示例代码:
from itertools import zip_longest
lists = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
for block in zip_longest(*lists):
print(block)
输出:
(1, 4, 6)
(2, 5, 7)
(3, None, 8)
(None, None, 9)
可以看到,zip_longest 函数将列表中的元素打破成了长度相同的块,并使用了 None 来填充不够的位置。
如果安装了 numpy 模块,可以使用它的 reshape 函数来完成这个任务。reshape 函数可以将一个多维数组重塑成一个指定形状的数组,但是要求重塑后的数组的总元素个数必须和原数组相同。
下面是一个示例代码:
import numpy as np
lists = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
max_len = max(len(l) for l in lists)
flat_list = np.array([item for sublist in lists for item in sublist])
reshaped_array = flat_list.reshape((-1, max_len))
print(reshaped_array.tolist())
输出:
[[1, 2, 3],
[4, 5, None],
[6, 7, 8, 9]]
可以看到,reshape 函数将多个列表垂直排列,并在不足的部分用 None 填充。
我们也可以自己编写一个函数来完成这个任务。下面是一个示例代码:
def chunk_lists(lists):
max_len = max(len(l) for l in lists)
padded_lists = [l + [None] * (max_len - len(l)) for l in lists]
return [tuple(row) for row in zip(*padded_lists)]
lists = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
print(chunk_lists(lists))
输出:
[(1, 4, 6),
(2, 5, 7),
(3, None, 8),
(None, None, 9)]
可以看到,我们先计算出最大的列表长度,然后将所有列表用 None 补齐到相同长度,再使用 zip 函数将它们打破成一个个块。