Skip to content

Python 中的「数组」:listarray 模块

Python 没有像 C/Java 那样单独的 array 关键字类型。日常里顺序、可变、可索引的序列,多数用 列表(list) 即可。

array 标准库模块提供 array.array:元素类型由 类型码(typecode) 固定,在内存中比「混用类型的列表」更紧凑,适合大批量同类型数字(与 C 数组交互、文件二进制读写等场景)。

下面约定:文中的 array 多指 array.array 实例list 指内置列表。

listarray.array 怎么选?

列表 listarray.array
元素类型任意对象,可混用由类型码限定,本质同构
典型用途通用容器、业务逻辑紧凑存储、与 C/二进制对接
方法丰富(见列表教程)序列常见操作 + tolist

科学计算里更常用第三方 numpy.ndarray,与本篇标准库 array 不同。

类型码(typecode)

构造方式:array.array(typecode[, iterable])

常用类型码(与 C 类型对应关系因平台/实现略有差异,以官方文档为准):

类型码C 类型Python 类型说明(概要)
'b'signed charint有符号字节
'B'unsigned charint无符号字节
'h'signed shortint有符号短整型
'H'unsigned shortint无符号短整型
'i'signed intint有符号整型(常用)
'I'unsigned intint无符号整型
'l'signed longint有符号长整型
'L'unsigned longint无符号长整型
'q'signed long longint有符号长长整型
'Q'unsigned long longint无符号长长整型
'f'floatfloat单精度浮点
'd'doublefloat双精度浮点(常用)

'u'(旧版 Unicode 字符)已弃用,新代码请用 strlist[str] 等表示文本,勿依赖 array('u', ...)

完整说明见官方文档 array — 高效的数值数组

创建与查看类型

python
import array

int_array = array.array("i", [1, 2, 3, 4])
float_array = array.array("f", [1.1, 2.2, 3.3, 4.4])

print(int_array)
print(float_array)
print(type(int_array))

输出(浮点打印精度因环境略有差异):

text
array('i', [1, 2, 3, 4])
array('f', [1.100000023841858, 2.200000047683716, 3.299999952316284, 4.400000095367432])
<class 'array.array'>

类型不一致时,创建或追加可能报错,例如向 'i' 数组放入非整数。

遍历与索引

python
import array

int_array = array.array("i", [1, 2, 3, 4])

for a in int_array:
    print(a)

for b in range(len(int_array)):
    print(f"int_array[{b}] = {int_array[b]}")

支持负索引,与列表类似:

python
int_array = array.array("i", [10, 20, 30, 40, 50, 60, 70, 80])
print(int_array[-2])  # 70
print(int_array[-5])  # 40

insertappend

python
import array

int_array = array.array("i", [1, 2, 3, 4])
int_array.insert(0, -1)  # [-1, 1, 2, 3, 4]
int_array.insert(2, -2)  # [-1, 1, -2, 2, 3, 4]
print(int_array)

int_array = array.array("i", [1, 2, 3, 4])
int_array.append(-3)
print(int_array)  # array('i', [1, 2, 3, 4, -3])

removepop

remove(x):删除第一个值等于 x 的元素;不存在则 ValueError

python
import array

int_array = array.array("i", [1, 2, 3, 4])
int_array.remove(2)
print(int_array)  # array('i', [1, 3, 4])

int_array = array.array("i", [1, 2, 3, 4])
try:
    int_array.remove(20)
except ValueError as e:
    print(e)

pop([i]):删除并返回下标 i 处元素;省略 i 则弹出最后一个

python
import array

int_array = array.array("i", [1, 2, 3, 4])
last_element = int_array.pop()
print(last_element)  # 4
print(int_array)    # array('i', [1, 2, 3])

second_element = int_array.pop(1)
print(second_element)  # 2
print(int_array)       # array('i', [1, 3])

切片

切片得到新的 array,原数组不变;支持负索引。

python
import array

int_array = array.array("i", [0, 1, 2, 3, 4, 5])
print(int_array[3:])   # array('i', [3, 4, 5])
print(int_array[:2])   # array('i', [0, 1])
print(int_array[1:3])  # array('i', [1, 2])
print(int_array[-2:])  # array('i', [4, 5])
print(int_array[:-2])  # array('i', [0, 1, 2, 3])

indexcount

python
import array

int_array = array.array("i", [0, 1, 2, 3, 1, 2])
print(f"1 首次出现在下标 {int_array.index(1)}")

try:
    print(int_array.index(20))
except ValueError as e:
    print(e)
python
int_array = array.array("i", [0, 1, 1, 0])
print(int_array.count(1))   # 2
print(int_array.count(10))  # 0

按下标更新

python
import array

int_array = array.array("i", [0, 1, 2, 3, 1, 2])
int_array[0] = -1
int_array[1] = -2
print(int_array)

try:
    int_array[10] = -10
except IndexError as e:
    print(e)

reverse

python
import array

int_array = array.array("i", [0, 1, 2, 3])
int_array.reverse()
print(int_array)  # array('i', [3, 2, 1, 0])

extend

可迭代对象中的元素追加到末尾;元素类型须与数组类型码兼容。

python
import array

array1 = array.array("i", [0, 1])
array2 = array.array("i", [2, 3, 4])

array1.extend(array2)
print(array1)  # array('i', [0, 1, 2, 3, 4])
print(array2)  # array('i', [2, 3, 4])

array2.extend([1, 2])
print(array2)  # array('i', [2, 3, 4, 1, 2])

array1 = array.array("i", [1])
array1.extend(sorted({0, 2}))  # 集合无序,排序后顺序确定
print(array1)  # array('i', [1, 0, 2])

与列表互转:tolist

python
import array

int_array = array.array("i", [0, 1, 2, 3])
print(int_array.tolist())  # [0, 1, 2, 3]

也可用 list(int_array) 得到列表(再拷贝一层视实现而定,一般用于小数据即可)。

小结

  • 通用序列优先 list;需要定类型、省内存或对接 C/二进制 时考虑 array.array
  • 类型码 指定元素类型;'u' 已弃用,文本用 str / list
  • 常用操作与列表类似:索引、切片、append/insert/pop/remove/index/count/reverse/extend,另 tolist() 转列表。

参考