这篇文章是对Python 列表和如何分割它们的考察 -- 从标准 Python 中的不同实现开始,然后考察Python 的列表理解能力。
本文描述的解决方案将适用于 ints、字符串、列表和其它对象的列表。
文章例子的简短总结。
解决方案 1:使用 itertools 的 Python 拆分列表
我们将从itertools 开始,展示如何用zip_longest 来分割一个列表。
我们将在 Python 中声明一个包含 21 个元素的范围,并将其分割成 4 个元素的组。我们将把这个范围转换为一个列表。
正如你在下面的例子中看到的,如果是一个较小的组--结果列表将被填入None 。
import itertools as it
my_list = list(range(21))
n = 4
list(it.zip_longest(*[iter(my_list)] * n))
结果。
[(0, 1, 2, 3),
(4, 5, 6, 7),
(8, 9, 10, 11),
(12, 13, 14, 15),
(16, 17, 18, 19),
(20, None, None, None)]
解决方案 2:Python 用列表理解法分割列表
另一个将列表分割成相等的小块的方法是使用 Python 列表理解。
在这种情况下,我们要把一个 21 个元素的列表分割成每个元素 5 个的列表。
my_list = list(range(21))
n = 5
[my_list[i:i+n] for i in range(0, len(my_list), n)]
结果。
[[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20]]
与前面的解决方案不同的是,最后一个列表将只有初始列表中的元素。
解决方案3:用numpy分割列表
我最喜欢的解决方案是来自numpy 。有两种方法可以分割数组或列表。
np.splitnp.array_split
它们可以以不同的方式分割列表。
np.array_split 定义了块的总数,而不是每个块的元素数。
因此,如果我们想把23个元素分成5组。
import numpy as np
my_list = list(range(23))
np.array_split(my_list, 5)
我们将得到3个5元素的列表和2个4元素的列表。
[array([0, 1, 2, 3, 4]),
array([5, 6, 7, 8, 9]),
array([10, 11, 12, 13, 14]),
array([15, 16, 17, 18]),
array([19, 20, 21, 22])]
np.split 得到indices_or_sections 。因此,为了将同一个23个项目的列表分割成5个列表,我们可以使用。
n = 5
np.split(my_list, range(n, n*n, n))
其结果是:。
[array([0, 1, 2, 3, 4]),
array([5, 6, 7, 8, 9]),
array([10, 11, 12, 13, 14]),
array([15, 16, 17, 18, 19]),
array([20, 21, 22])]
它是如何工作的?我们给出了列表和我们想分割列表的索引。
因此,如果我们想在每个子列表中得到5个项目的块,我们将产生如下的索引。
range(5, 25, 5)
输出。
[5, 10, 15, 20]
解决方案4:Python用zip分割列表
还有一个选择是在Python中用zip来分割列表。这个解决方案似乎很简单,因为。
my_list = list(range(15))
n = 3
list(zip(*[iter(my_list)]*n))
这将产生。
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]
但在元素分布不均匀的情况下会产生意想不到的结果。
my_list = list(range(17))
n = 3
list(zip(*[iter(my_list)]*n))
结果。
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]