📜  如何在python中打破列表大小不等的块(1)

📅  最后修改于: 2023-12-03 14:52:50.379000             🧑  作者: Mango

如何在 Python 中打破列表大小不等的块

在 Python 中,我们可以使用列表来存储一系列数据。但是,有时候我们可能会遇到这样的情况:我们有一个由多个列表组成的列表,每个列表的大小可能不同,我们想要将它们打破成一系列相同大小的块。

下面介绍三种方法来打破列表大小不等的块。

方法一:使用 itertools 模块中的 zip_longest 函数

可以使用 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 函数

如果安装了 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 函数将它们打破成一个个块。