Python列表、元组与array数组之间的相互转换方法

Dylan
Dylan
发布时间:2026-10-29| 6人浏览过
原创

详细讲解 Python 中列表(list)、元组(tuple)与标准库 array 数组之间的相互转换方法,涵盖内置函数转换、tolist()方法、类型码选择以及常见类型异常防范。

在 Python 开发中,列表(list)、元组(tuple)与标准库 array 模块中的数组对象分别承载着不同场景下的数据组织需求。列表灵活可变,元组轻量只读,而 array 数组则以连续紧凑的内存存储同构数值。掌握这三者之间的双向转换方法,不仅能保证数据在不同处理阶段顺利传递,还能根据计算需求兼顾内存开销与运行效率。

一、三者数据结构特性与转换拓扑

列表与元组属于 Python 内置的核心容器类型,可以容纳任意类型的异构对象。列表支持动态增删与修改,元组在定义后其结构与内容不可变。而 array 属于 Python 标准库 array 模块提供的数值容器,其核心特征是内部元素必须为相同类型,并由特定的类型码(typecode)指定所占字节数与底层 C 语言数据类型。

三者之间的转换均可通过内置工厂函数(list()、tuple())、标准库构造器(array.array())以及专用导出接口(tolist())完成。在执行转换前,建立清晰的数据流转认知至关重要。

Python列表、元组与array数组之间的相互转换方法
图 1:Python 列表、元组与 array 数组的核心属性对比与转换拓扑

二、列表与元组的相互转换

列表与元组之间的转换是 Python 编程中最常见的基础操作。由于两者都属于内置的标准可迭代对象,转换过程直接调用对应的类型构造器即可完成。

1. 列表转为元组:tuple()

将已有列表作为实参传入 tuple() 构造器中,Python 会遍历该列表并创建一个新的元组对象返回。新元组中的元素与原列表对应位置的元素保持相同的引用。

# 1. 列表转元组示例
source_list = [10, 20, 30, 40]
converted_tuple = tuple(source_list)

print("转换结果:", converted_tuple)
print("类型确认:", type(converted_tuple))

# 示例输出:
# 转换结果: (10, 20, 30, 40)
# 类型确认: <class 'tuple'>

2. 元组转为列表:list()

当需要对已有的不可变元组进行增删或原位排序时,将其传入 list() 构造器即可生成一个包含相同元素的可变列表。

# 2. 元组转列表示例
source_tuple = ("apple", "banana", "cherry")
converted_list = list(source_tuple)

converted_list.append("orange")
print("转换并追加元素后的列表:", converted_list)
print("类型确认:", type(converted_list))

# 示例输出:
# 转换并追加元素后的列表: ['apple', 'banana', 'cherry', 'orange']
# 类型确认: <class 'list'>
注意事项: tuple() 与 list() 的转换过程均属于浅拷贝(Shallow Copy)。如果原序列内部包含可变容器(如嵌套子列表),转换后新容器内存储的仍然是指向同一可变对象的引用,修改嵌套子对象会同时影响两边。

三、列表/元组转换为 array 数组的方法与步骤

与原生容器不同,array 对象来自 Python 标准库的 array 模块。在转换前必须明确两个前提:第一,数据必须是纯数值型(如整型或浮点型),不能混入字符串或任意自定义对象;第二,必须根据数值的取值范围选择正确的类型码(Typecode)。

1. 常见类型码速查

类型码 对应 C 语言类型 Python 表现类型 常见最小字节数 说明与取值范围
'b' / 'B' signed char / unsigned char int 1 有符号 (-128 ~ 127) / 无符号 (0 ~ 255)
'h' / 'H' signed short / unsigned short int 2 短整型
'i' / 'I' signed int / unsigned int int 2 或 4 常用整型(通常为 4 字节,支持常规范围整数)
'l' / 'L' signed long / unsigned long int 4 或 8 长整型
'q' / 'Q' signed long long / unsigned long long int 8 64位大整型,用于大数存储
'f' float float 4 单精度浮点数
'd' double float 8 双精度浮点数(Python 浮点数默认对应 double)
Python列表、元组与array数组之间的相互转换方法
图 2:从列表或元组转换为 array 数组的标准操作步骤

2. 具体代码实现

# 引入标准库 array 模块
import array

# (1) 列表转换为整型 array 数组
int_list = [100, 200, 300, 400]
arr_from_list = array.array('i', int_list)

print("列表转换结果:", arr_from_list)
print("数组类型码:", arr_from_list.typecode)
print("单个元素字节大小:", arr_from_list.itemsize)

# (2) 元组转换为双精度浮点型 array 数组
float_tuple = (1.25, 3.5, 7.875)
arr_from_tuple = array.array('d', float_tuple)

print("元组转换结果:", arr_from_tuple)
print("元素总数:", len(arr_from_tuple))

# 示例输出:
# 列表转换结果: array('i', [100, 200, 300, 400])
# 数组类型码: i
# 单个元素字节大小: 4
# 元组转换结果: array('d', [1.25, 3.5, 7.875])
# 元素总数: 3

四、array 数组转换为列表与元组的方法

当数据在 array 中完成高效的数值计算或底层 I/O 读取后,往往需要导出回常规的列表或元组,以便与 JSON 序列化、Web 框架或常规业务函数对接。

1. 导出为列表:tolist() 与 list()

将 array 转为列表有两种标准方法:

  • 推荐方法:arr.tolist() —— 这是 array 对象原生提供的专门方法,在 C 语言层面预先根据数组长度直接申请 Python 列表空间并快速解包,执行性能最优。
  • 通用方法:list(arr) —— 通过 Python 层的迭代器协议(Iterable Protocol)逐个提取元素并追加至新列表,语法通用,但在处理海量数据时开销略高于 tolist()。

2. 导出为元组:tuple()

将 array 转为元组主要有两种写法:直接使用 tuple(arr),或者使用 tuple(arr.tolist())。直接传入 tuple(arr) 最为直观且语义清晰。

Python列表、元组与array数组之间的相互转换方法
图 3:array 数组导出为列表与元组的方法选择与内存流向

3. 代码示例与输出验证

import array

# 初始化一个双精度浮点数组
arr_data = array.array('d', [3.14, 2.718, 1.414, 0.618])

# 方式 1:使用 tolist() 导出为列表 (推荐)
list_result_1 = arr_data.tolist()

# 方式 2:使用 list() 工厂函数导出
list_result_2 = list(arr_data)

# 方式 3:导出为只读元组
tuple_result = tuple(arr_data)

print("tolist() 结果:", list_result_1)
print("list(arr) 结果:", list_result_2)
print("tuple(arr) 结果:", tuple_result)

# 验证独立性:修改导出后的列表,原 array 保持不变
list_result_1.append(9.99)
print("修改后的列表长度:", len(list_result_1))
print("原 array 数组长度:", len(arr_data))

# 示例输出:
# tolist() 结果: [3.14, 2.718, 1.414, 0.618]
# list(arr) 结果: [3.14, 2.718, 1.414, 0.618]
# tuple(arr) 结果: (3.14, 2.718, 1.414, 0.618)
# 修改后的列表长度: 5
# 原 array 数组长度: 4

五、核心转换避坑指南与类型异常防范

在实际工程开发中,类型转换往往伴随着异常边界。以下是三个最常遇到的问题及排查方法:

1. 类型严格性与 TypeError

Python 的 list 允许混存 [1, 2.5, "test"]。但若试图将包含字符串或包含浮点数的列表直接转入整型 array.array('i', ...),Python 不会执行隐式向下取整,而是直接抛出 TypeError: integer argument expected, got float。

解决方案:在转换前通过列表推导式显式规范化数据:

raw_mixed_list = [1.8, 2.3, 3.9]
# 显式转换为整型列表后再入 array
clean_int_arr = array.array('i', [int(x) for x in raw_mixed_list])
print("规范化后转换结果:", clean_int_arr)
# 示例输出: 规范化后转换结果: array('i', [1, 2, 3])

2. 范围溢出与 OverflowError

选择类型码时,若原数据的数值超出了对应 C 类型的位宽上限,会触发 OverflowError。例如类型码 'b' 取值范围是 -128 到 127,若列表中包含数值 200,转换将失败。

解决方案:对于大于 127 的无符号字节数据使用 'B',对于大整数使用 'q'(有符号 64 位)或 'Q'(无符号 64 位)。

3. 勿混淆标准库 array 与 NumPy 的 ndarray

Python 内置的 array.array 仅支持一维数值数组,无多维广播和矩阵数学运算功能。如果工程中需要二维矩阵或张量计算,应使用三方库 numpy.array()。但如果是为了在不依赖第三方扩展库的前提下精简内存开销,标准库 array 是最轻量的纯内置选择。

Python列表、元组与array数组之间的相互转换方法
图 4:全流程转换速查与避坑总结

六、总结

Python 列表、元组与标准库 array 之间的相互转换方式清晰而有条理:

  • 列表与元组之间:直接使用 tuple(list_obj) 与 list(tuple_obj) 即可完成转换,过程简捷、规则通用。
  • 转向 array 数组:先执行 import array,根据数值特征选定类型码(整型常用 'i'、大整型用 'q'、浮点数用 'd'),再调用 array.array(typecode, sequence) 构造实例。
  • array 导出序列:导出为列表首选 arr.tolist(),导出为元组直接使用 tuple(arr)。

在日常开发中,根据数据是否需要修改、是否需要保护以及是否涉及海量数值内存优化,合理选择对应容器并在适当时机进行转换,是编写健壮、高效 Python 代码的重要基础。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。