Python中高效转换itertools.chain对象为数组的两种方法

不晚
不晚
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍在Python中将itertools.chain对象转换为数组的两种常用方法。第一种直接使用list(),操作简单但存在嵌套列表且效率较低的问题;第二种推荐利用numpy库的np.fromiter()函数,通过指定数据类型实现更高效的转换。通过代码示例与时间对比,验证了numpy方法在处理大规模数据时的速度优势,为开发者提供性能更优的解决方案。

在1月总结中曾提到,计划每天或每两天更新一篇学习笔记,这是系列更新的第一篇。

itertools.chain对象转数组的方法

本文主要讲解如何将itertools.chain对象转换为数组。

参考来源为StackOverflow上的回答:Get an array back from an itertools.chain object,具体链接如下:

https://stackoverflow.com/questions/26853860/get-an-array-back-from-itertools-chain-object

具体示例如下:


list_of_numbers = [[1, 2], [3], []]
import itertools
chain = itertools.chain(*list_of_numbers)

两种转换方案对比

实现转换主要有两种解决思路:

第一种方式较为简单,直接调用list()函数,代码如下:

list(chain)

然而,这种方法存在两个主要缺点:

结果会在外层多嵌套一层列表结构。

执行效率相对不高。

第二种方法是利用numpy库提供的np.fromiter()函数,示例如下:

>>> import numpy as np
>>> from itertools import chain
>>> list_of_numbers = [[1, 2], [3], []]
>>> np.fromiter(chain(*list_of_numbers), dtype=int)
array([1, 2, 3])

对比两种方法的运算耗时,结果如下:


>>> list_of_numbers = [[1, 2]*1000, [3]*1000, []]*1000
>>> %timeit np.fromiter(chain(*list_of_numbers), dtype=int)
10 loops, best of 3: 103 ms per loop
>>> %timeit np.array(list(chain(*list_of_numbers)))
1 loops, best of 3: 199 ms per loop

从数据可以看出,采用numpy方法的运算速度明显更快。

itertools.chain()方法补充

补充说明:以下介绍itertools模块中chain()方法的相关用法。


# -*- coding:utf-8 -*-
from itertools import chain
from random import randint
# 随机生成 19 个整数(在 60 到 100 之间)
c1 = [randint(60, 100) for _ in range(19)]
# 随机生成 24 个整数(在 60 到 100 之间)
c2 = [randint(60, 100) for _ in range(24)]
# 随机生成 42 个整数(在 60 到 100 之间)
c3 = [randint(60, 100) for _ in range(42)]
# 随机生成 22 个整数(在 60 到 100 之间)
c4 = [randint(60, 100) for _ in range(22)]
count = 0
# chain()可以把一组迭代对象串联起来,形成一个更大的迭代器
for s in chain(c1, c2, c3, c4):
  if s > 90:
    count += 1
print('4 个班单科成绩大于 90 分的人次为', count)

总结

以上介绍了Python中转换itertools.chain对象为数组的方法,希望内容对大家有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表