python数组array.array

1. 简介

在Python编程语言中,array模块提供了一种序列型的容器,即数组。它是由一组相同数据类型的元素构成,可以用于存储大量的数据,具有效率高、占用内存少等优点。这样的数组是一个像列表一样的对象,但仅包含类型相同的元素。如果需要在Python中使用数值数据,则可以使用数组模块。它也提供了非常方便的方法来对数组进行操作。

1.1 数组对象

array模块提供了一个名为array的类型,它表示数组对象。这个类型有以下属性:

typecode: 用来表示数组中元素的数据类型字符。

itemsize: 用来表示一个数组元素在内存中所占的字节数。

buffer_info(): 返回一个元组,包含两个值: 第一个是数组元素在内存中的起始位置,第二个是数组元素的个数。

append(x): 在数组的末尾添加x。

extend(iterable): 使用 iterable 中的所有元素来扩展数组。

count(x): 返回数组中 x 出现的次数。

index(x): 返回 x 在数组中的第一个位置。如果不存在,则引发 ValueError 。

insert(i, x): 在位置 i 插入一个元素 x 。

pop([i]): 删除并返回数组中的最后一个元素,或删除并返回位置为 i 的元素。

remove(x): 从数组中删除第一个值为 x 的元素。如果不存在,则引发 ValueError 。

reverse(): 反转数组中的顺序。

tobytes(): 将数组转换为字符串,其中每个元素用它的二进制形式进行表示。

tofile(f): 将数组写入文件对象 f 中,它必须是带有 write() 方法的文件对象。

tolist(): 将数组转换为列表。

2. 基本操作

2.1 创建数组

要创建一个数组,需要使用array.array()构造函数。这个构造函数有两个参数,第一个是数组元素的类型码,第二个是可选的初始数组值。例如,以下代码创建了一个由浮点数构成的数组:

import array

a = array.array('f', [1.0, 2.0, 3.0, 4.0])

print(a)

输出结果为:

array('f', [1.0, 2.0, 3.0, 4.0])

在该代码中,我们传递了浮点型的类型码 'f',并使用一个包含四个浮点数的列表来初始化数组 a 。你也可以使用形如 'i' 和 'd' 的类型码创建 int 和 double 类型的数组。 任何类型码均可在 Python 官方文档中找到。

2.2 访问数组元素

数组支持随机访问,因此可以像列表一样使用数组的索引来访问其中的元素。索引从 0 开始,并且可以是负数,表示从右侧开始反向索引。

import array

a = array.array('i', [1, 2, 3, 4, 5])

print(a[0])

print(a[-1])

输出结果为:

1

5

2.3 修改数组元素

你可以修改数组中的元素,就像修改列表中的元素一样。这可以通过直接给数组的索引赋值来完成:

import array

a = array.array('i', [1, 2, 3, 4, 5])

a[0] = 100

print(a)

输出结果为:

array('i', [100, 2, 3, 4, 5])

2.4 获取数组的长度

要获取数组中元素的数量,可以使用 len() 函数:

import array

a = array.array('i', [1, 2, 3, 4, 5])

print(len(a))

输出结果为:

5

3. 数组与列表的区别

3.1 数组的优点

使用数组而不是列表有以下优点:

效率高: 数组中的元素可以被紧密的打包在一起,这使得数组比列表更加紧凑和高效。这意味着可以在相同的内存占用情况下存储更多的数据。此外,由于数组中的数据类型通常是固定的,因此解释器可以使用更快的机器码来操作它们。

支持数值操作: 数组模块支持很多数值数据处理操作,例如计算和排序,而这些操作在列表中都需要使用显式的 for 循环来实现。

支持计算: 可以像 NumPy 数组一样在数组上进行科学计算。

3.2 数组的局限

使用数组而不是列表也有一些局限:

数组只能包含相同的数据类型: 在数组中只能包含一个数据类型,而在列表中可以包含不同类型的数据,这使得列表更加灵活。

数组不支持插入和删除操作: 在列表中添加、插入和删除元素是非常简单的。在数组中也可以实现这些操作,但是效率通常很低,因为它需要重建整个数组。

4. 数组的高级操作

4.1 数组与数学运算

与 NumPy 数组类似,数组也支持各种数学运算,包括加法、减法、乘法、除法等。这些运算通常是对数组中的每个元素都执行的。

import array

a = array.array('f', [1.0, 2.0, 3.0, 4.0])

b = array.array('f', [5.0, 6.0, 7.0, 8.0])

c = array.array('f') #创建一个新的空数组

for i in range(len(a)):

c.append(a[i] + b[i])

print(c)

输出结果为:

array('f', [6.0, 8.0, 10.0, 12.0])

4.2 数组排序

数组的元素可以使用sorted()函数进行排序。 sorted() 函数返回一个新的已排序的列表,而不会修改原始数组。

import array

a = array.array('i', [3, 2, 4, 1, 5])

b = sorted(a)

print(a) # 输出原始数组

print(b) # 输出已排序的列表

输出结果为:

array('i', [3, 2, 4, 1, 5])

[1, 2, 3, 4, 5]

4.3 数组索引切片

与列表类似,数组也支持索引和切片操作。这些操作允许获取数组的单个元素或一个子集。数组的切片也是一个数组,可用于分离特定的元素或对它们进行操作。

import array

a = array.array('i', [1, 2, 3, 4, 5])

print(a[1:3]) # 输出索引从 1 到 2 的元素

输出结果为:

array('i', [2, 3])

4.4 数组逆序

数组中的元素也可以反转,即从尾到头排列。这可以使用数组的reverse()方法完成。

import array

a = array.array('i', [1, 2, 3, 4, 5])

a.reverse()

print(a)

输出结果为:

array('i', [5, 4, 3, 2, 1])

4.5 数组的拷贝

数组也支持拷贝,以保留数组的内容并允许在应用的整个生命周期内使用它。有两种基本的拷贝方式:浅拷贝和深拷贝。

4.5.1 浅拷贝

浅拷贝是一种备份数组的方法,只拷贝数组中元素的引用,而不是数组的实际数据。因此,如果更改了一个元素,原始数组和浅拷贝数组都会受到影响。

import array

a = array.array('i', [1, 2, 3, 4, 5])

b = a #浅拷贝

a[0] = 100

print(a)

print(b)

输出结果为:

array('i', [100, 2, 3, 4, 5])

array('i', [100, 2, 3, 4, 5])

4.5.2 深拷贝

在深拷贝中,数组和其元素的所有内容都被复制,包括元素的值和内存地址。这意味着原始数组和拷贝数组可以独立地修改而不会相互影响。

import array

import copy #需要导入 copy 模块

a = array.array('i', [1, 2, 3, 4, 5])

b = copy.deepcopy(a) #深拷贝

a[0] = 100

print(a)

print(b)

输出结果为:

array('i', [100, 2, 3, 4, 5])

array('i', [1, 2, 3, 4, 5])

5. 总结

在Python中,数组是一个非常有用的数据结构。使用数组而不是列表可以提高代码的效率,特别是当需要存储大量的数据时。数组对于数值计算和科学计算非常有用。我们可以使用数组进行各种数学运算,例如加、减、乘、除、排序等。在此基础上,我们还可以执行数组的切片和索引操作,以及复制和反转等高级操作。

后端开发标签