写点什么

Python 中的数组哪去了?

作者:宇宙之一粟
  • 2022 年 2 月 22 日
  • 本文字数:2096 字

    阅读完需:约 7 分钟

或许我们学 Python,只听过列表(list)、元组(tuple)、集合(set)、字典(dict)


那个流行在 Java、C++和 C 中常见的那个“狠人”——数组去哪了呢?


本文将带你学习一下


  • Python 的数组(array)

  • 数组与列表有哪些不同

  • 数组的操作

  • 什么时候和如何使用数组?


在编程中,数组是相同类型的元素的集合。存储在连续内存位置。


但是,在 Python 中,它们并不常见。


当人们谈 Python 数组时,他们谈论的是 Python 列表。如果您不知道什么是列表,自行了解一下。


或者等我出一篇 Python 列表文章。


Python 官方还是考虑周到的,给我们提供了高效的数值数组——array模块


先导入这个模块,然后查看这个模块下有哪些函数:


In [1]: import array
In [2]: dir(array)Out[2]:['ArrayType', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_array_reconstructor', 'array', 'typecodes']
复制代码

列表 vs. array 模块的 array

我们可以将列表当作数组用,但是别忘了数组的定义——相同类型。是的,在列表中,我们不能限制元素的类型。


>>>a = [1, 2, 'Hello']
复制代码


如果使用 array 模块创建数组,则数组的所有元素必须为相同的数值类型。语法结构:a=arr.array(data type,value list)


>>> import array as arr>>> a = arr.array('d', [1, 2, 'Hello'])Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: must be real number, not str
复制代码

如何创建数组?

首先,我们需要导入数组模块以创建数组。


例如:


>>> import array as arr>>> a = arr.array('d', [1.1, 2.3, 4.8])>>> print(a)array('d', [1.1, 2.3, 4.8])
复制代码


在这里,我们创建了一个 float 类型的数组。字母“ d”是类型码。这确定了创建过程中数组的类型。


常用的类型代码:



注释:'u' 类型码对应于 Python 中已过时的 unicode 字符 (Py_UNICODE即 wchar_t)。 根据系统平台的不同,它可能是 16 位或 32 位。自版本 3.3 起,'u' 将与其它的 Py_UNICODE API 一起被移除


我们将不在本文中讨论不同的 C 类型。在整篇文章中,我们将使用两种类型的代码:'i'表示整数,' d'表示浮点数。

基本的数组操作:

如何访问数组元素?

像列表一样支持索引,索引值从 0 开始,同时支持循环访问:


>>> import array as arr>>> a = arr.array('i', [2, 4, 6, 8, 10])>>> print('First element:', a[0])First element: 2>>> for i in a:...     print(i)...246810
复制代码

如何切片?

使用切片运算符 :,只要是 Python 的序列类型,你就拿出这把刀。


>>> import array as arr>>> a = arr.array('i', [2, 4, 6, 8, 10])>>> print(a[2:5])array('i', [6, 8, 10])  # 从 3rd 到 5th>>> print(a[:-3])  # 从 1st 到 2ndarray('i', [2, 4])>>> print(a[:])  # 全复制array('i', [2, 4, 6, 8, 10])>>> print(a[::-1])  # 反转array('i', [10, 8, 6, 4, 2])
复制代码

如何更改或添加元素?

数组是可变的;它们的元素可以类似列表的方式进行更改。


import array as arr
numbers = arr.array('i', [1, 2, 3, 5, 7, 10])
# changing first elementnumbers[0] = 0 print(numbers) # Output: array('i', [0, 2, 3, 5, 7, 10])
# changing 3rd to 5th elementnumbers[2:5] = arr.array('i', [4, 6, 8]) print(numbers) # Output: array('i', [0, 2, 4, 6, 8, 10])
复制代码


我们可以使用append()方法将一项添加到列表中,或者使用extend()方法将多项添加到列表中。


import array as arr
numbers = arr.array('i', [1, 2, 3])
numbers.append(4)print(numbers) # Output: array('i', [1, 2, 3, 4])
# extend() appends iterable to the end of the arraynumbers.extend([5, 6, 7]) print(numbers) # Output: array('i', [1, 2, 3, 4, 5, 6, 7])
复制代码


我们可以使用+运算符连接两个数组。


import array as arr
odd = arr.array('i', [1, 3, 5])even = arr.array('i', [2, 4, 6])
numbers = arr.array('i') # creating empty array of integernumbers = odd + even
print(numbers)
复制代码

如何 remove/delete 元素?

我们可以使用 Python 的del语句从数组中删除一个或多个项目。


import array as arr
number = arr.array('i', [1, 2, 3, 3, 4])
del number[2] # removing third elementprint(number) # Output: array('i', [1, 2, 3, 4])
del number # deleting entire arrayprint(number) # Error: array is not defined
复制代码


我们可以使用remove()方法删除给定项,pop()方法删除给定索引处的项。


import array as arr
numbers = arr.array('i', [10, 11, 12, 12, 13])
numbers.remove(12)print(numbers) # Output: array('i', [10, 11, 12, 13])
print(numbers.pop(2)) # Output: 12print(numbers) # Output: array('i', [10, 11, 13])
复制代码

总结:什么时候使用数组?

列表比数组灵活得多。它们可以存储不同数据类型的元素,包括字符串。而且,列表比数组要快。而且,如果您需要对数组和矩阵进行数学计算,则最好使用NumPy库中数组的方法。


除非需要与 C 代码接口,此时需要用到数组模块,否则不要使用它们。


Ps:本文基于 Python 3.8 推荐阅读:python-arraysarrays-in-python

发布于: 刚刚阅读数: 2
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Python 中的数组哪去了?