python 数组和列表的对比

虽然列表既灵活又简单,但面对各类需求时,我们可能会有更好的选择。比如,要存放1000 万个浮点数的话,数组(array)的效率要高得多,因为数组在背后存的并不是 float对象,而是数字的机器翻译,也就是字节表述。这一点就跟 C 语言中的数组一样。再比如说,如果需要频繁对序列做先进先出的操作,deque(双端队列)的速度应该会更快。

如果在你的代码里,包含操作(比如检查一个元素是否出现在一个集合中)的频率很高,用 set(集合)会更合适。set 专为检查元素是否存在做过优化。但是它并不是序列,因为 set 是无序的。

数组

如果我们需要一个只包含数字的列表,那么 array.arraylist 更高效。数组支持所有跟可变序列有关的操作,包括 .pop.insert.extend。另外,数组还提供从文件读取和存入文件的更快的方法,如 .frombytes.tofile

Python 数组跟 C 语言数组一样精简。创建数组需要一个类型码,这个类型码用来表示在底层的 C 语言应该存放怎样的数据类型。比如 b 类型码代表的是有符号的字符(signed char),因此 array('b') 创建出的数组就只能存放一个字节大小的整数,范围从 -128 ~127,这样在序列很大的时候,我们能节省很多空间。而且 Python 不会允许你在数组里存放除指定类型之外的数据。

下面示例展示了从创建一个有 1000 万个随机浮点数的数组开始,到如何把这个数组存放到文件里,再到如何从文件读取这个数组。

# -*- coding: utf-8 -*-
from array import array  # 引入 array 类型
from random import random

# 利用一个可迭代对象来建立一个双精度浮点数组(类型码是 'd'),这里我们用的可迭代对象是一个生成器表达式。
floats = array('d', (random() for i in range(10**7)))
print(floats[-1])  # 查看数组的最后一个元素。

fp = open('floats.bin', 'wb')
floats.tofile(fp)  # 把数组存入一个二进制文件里。
fp.close()

floats2 = array('d')  # 新建一个双精度浮点空数组。
fp = open('floats.bin', 'rb')
floats2.fromfile(fp, 10 ** 7)  # 把 1000 万个浮点数从二进制文件里读取出来。
fp.close()

print(floats2[-1])  # 查看新数组的最后一个元素。

print(floats2 == floats)  # 检查两个数组的内容是不是完全一样。

在这里插入图片描述
从上面的代码我们能得出结论,array.tofilearray.fromfile 用起来很简单。把这段代码跑一跑,你还会发现它的速度也很快。一个小试验告诉我,用 array.fromfile 从一个二进制文件里读出 1000 万个双精度浮点数只需要 0.1 秒,这比从文本文件里读取的速度要快60倍,因为后者会使用内置的 float 方法把每一行文字转换成浮点数。另外,使用 array.tofile 写入到二进制文件,比以每行一个浮点数的方式把所有数字写入到文本文件要快 7倍。另外,1000 万个这样的数在二进制文件里只占用 80 000 000 个字节(每个浮点数占用8 个字节,不需要任何额外空间),如果是文本文件的话,我们需要 181 515 739 个字节。

另外一个快速序列化数字类型的方法是使用 picklehttps://docs.python.org/3/library/pickle.html)模块。pickle.dump 处理浮点数组的速度几乎跟 array.tofile 一样快。不过前者可以处理几乎所有的内置数字类型,包含复数、嵌套集合,甚至用户自定义的类。前提是这些类没有什么特别复杂的实现。

还有一些特殊的数字数组,用来表示二进制数据,比如光栅图像。里面涉及的 bytesbytearry 类型。

下图,列表和数组的属性和方法(不包含过期的数组方法以及那些由对象实现的方法)
在这里插入图片描述
在这里插入图片描述
Python 3.4 开始,数组类型不再支持诸如 list.sort() 这种就地排序方法。要给数组排序的话,得用 sorted 函数新建一个数组:

a = array.array(a.typecode, sorted(a))

如果想要在不打乱次序的情况下为数组添加新的元素,bisect.insort 还是能派上用场

<think> 首先,用户的问题是:“我想查找将Python数组转换为列表的方法 请问Python数组转换为列表的方法”。他们引用了三个来源,这些来源讨论了在Python中使用tolist()方法将数组或矩阵转换为列表。 关键点来自引用: - 引用[1]:使用tolist()方法将数组或矩阵转换为列表。 - 引用[2]:详细解释了numpy数组的tolist()方法,包括示例。 - 引用[3]:提到使用list()将矩阵数组整体转换成列表,但建议使用.tolist()或.tolist()(可能是打字错误,应为.tolist())来转换。 用户明确询问将Python数组转换为列表的方法。在Python中,数组可能指的是numpy数组,因为标准Python列表已经是列表形式。但基于引用,似乎焦点在numpy数组上。 根据系统指令: - 所有行内数学表达式必须使用$...$。 - 独立公式使用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 我的回答需要: 1. 结构清晰:逐步解释方法。 2. 真实可靠:基于提供的引用。 3. 生成相关问题。 4. 添加引用标识在引用段落末尾。 步骤: 1. **介绍方法**:解释如何将数组转换为列表,使用tolist()方法。 2. **提供示例**:引用中给出了示例代码,我应该包括一个简单的代码示例。 3. **澄清差异**:区分list()tolist(),因为引用[3]提到list()转换可能不如tolist()彻底。 4. **添加引用**:在相关部分末尾添加[^1], [^2], [^3]。 5. **生成相关问题**:在回答结束时,添加相关问题部分。 结构建议: - 开头:直接回答用户的问题。 - 解释方法:描述使用tolist()。 - 代码示例:展示如何使用。 - 注意事项:解释tolist()list()的区别。 - 结束:总结。 - 相关问题:列出几个相关问题。 相关问题主题: - 为什么使用tolist()而不是list()? - tolist()方法的性能如何? - 如何处理嵌套数组? - 其他转换方法? 基于引用: - [^1]:介绍tolist()方法。 - [^2]:详细说明tolist()。 - [^3]:对比list()tolist()。 最终回答大纲: 1. 引言:在Python中,特别是使用numpy库时,可以使用tolist()方法将数组转换为列表。 2. 方法描述:使用array.tolist()。 3. 示例代码:从引用[2]中改编。 4. 区别解释:比较tolist()list()。 5. 总结。 6. 相关问题。 确保使用中文。 </think> ### Python数组转换为列表的方法 在Python中,将数组(特别是NumPy数组)转换为列表是一种常见的操作,主要用于简化数据处理或与其他Python内置函数兼容。基于您提供的引用,核心方法是使用`.tolist()`函数,它能将数组或矩阵(包括嵌套结构)完全转换为Python列表形式。以下我将逐步解释这一方法,确保结构清晰,并基于引用内容提供可靠指导。 #### 步骤1: 理解`.tolist()`方法 - `.tolist()`是NumPy数组的内置方法(`numpy.ndarray.tolist`),它递归地将数组的所有元素转换为Python列表类型。这意味着外层内层的数据结构都会被转换为列表,确保转换彻底[^1][^2]。 - 语法:`array.tolist()`,其中`array`是您的NumPy数组对象。 - 优点:这种方法能处理多维数组(如矩阵),转换为嵌套列表,而不会丢失数据层级结构[^2]。 - 示例:如果您有一个二维数组(矩阵),`.tolist()`会将其转换为列表列表(如`[[1, 2], [3, 4]]`)。 #### 步骤2: 使用`.tolist()`的代码示例 以下是一个简单的Python代码示例,展示如何创建NumPy数组并应用`.tolist()`将其转换为列表。假设您已安装NumPy库(通过`pip install numpy`安装)。 ```python import numpy as np # 创建一个NumPy数组 arr = np.array([[1, 2], [3, 4]]) # 二维数组(矩阵) print("原始数组:", arr) # 使用tolist()转换为列表 list_from_arr = arr.tolist() print("转换后的列表:", list_from_arr) # 输出: [[1, 2], [3, 4]] ``` **解释**: - 此代码首先导入NumPy并创建一个二维数组。 - 调用`arr.tolist()`后,数组被转换为嵌套列表,元素类型变为Python标准类型(如整数)[^2]。 - 运行后,输出会显示转换结果,例如`[[1, 2], [3, 4]]`,这与引用[2]中的示例一致。 #### 步骤3: 注意事项常见问题 - **`.tolist()` vs `list()`的区别**: - `list(array)`仅将数组的外层转换为列表,但内层元素仍保持NumPy数组类型。这在处理多维数据时可能导致问题[^3]。 - `.tolist()`则彻底转换所有层级,确保结果是纯Python列表。 - 示例对比: ```python import numpy as np arr = np.array([[1, 2], [3, 4]]) # 使用list():转换不完全 list_result = list(arr) # 输出: [array([1, 2]), array([3, 4])],内层仍是数组 # 使用tolist():完全转换 tolist_result = arr.tolist() # 输出: [[1, 2], [3, 4]],全为列表 ``` 因此,在需要完全转换时,优先使用`.tolist()`[^3]。 - **数据类型转换**:`.tolist()`会将NumPy数据类型(如`int32`)转换为最兼容的Python类型(如`int`),避免计算错误[^2]。 - **重新创建数组**:如果需要从转换后的列表恢复数组,可以使用`np.array(list_data)`,如引用[2]所述[^2]。 #### 总结 要将Python数组(特别是NumPy数组)转换为列表,推荐使用`.tolist()`方法: 1. 确保数组是NumPy对象(使用`import numpy as np`)。 2. 调用`your_array.tolist()`获取完整列表。 3. 避免使用`list()`,因为它可能无法处理嵌套结构。 此方法高效可靠,广泛应用于数据处理科学计算中[^1][^2][^3]。如果您没有NumPy数组,而是标准Python列表(如`[1, 2, 3]`),则它已经是列表形式,无需转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值