如何在Python中把一个列表分割成大小均匀的列表

1,983 阅读3分钟

How to Split a List Into Evenly Sized Lists in Python

这篇文章是对Python 列表和如何分割它们的考察 -- 从标准 Python 中的不同实现开始,然后考察Python 的列表理解能力

本文描述的解决方案将适用于 ints、字符串、列表和其它对象的列表。

文章例子的简短总结。

How to Split a List Into Evenly Sized Lists in Python

解决方案 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.split
  • np.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)]