不是那个Python列表,是Python数组 —— Arrays(你没见过的全新版本)

简介: 不是那个Python列表,是Python数组 —— Arrays(你没见过的全新版本)

或许我们学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”是类型码。这确定了创建过程中数组的类型。

常用的类型代码:

类型码 C 类型 Python 类型 最小字节
‘b’ signed char int 1
‘B’ unsigned char int 1
‘u’ Py_UNICODE Unicode 2
‘h’ signed short int 2
‘H’ unsigned short int 2
‘i’ unsigned int int 2
‘l’ signed long int 4
‘L’ unsigned long int 4
‘q’ signed long long int 8
‘Q’ unsigned long long int 8
‘f’ float float 4
‘d’ double float 8

注释:

‘u’ 类型码对应于 Python 中已过时的 unicode 字符 ( Py_UNICODE即 wchar_t)。 根据系统平台的不同,它可能是 16 位或 32 位。

自版本3.3起,‘u’ 将与其它的 Py_UNICODE API 一起被移除

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

 基本的数组操作:

image.png

如何访问数组元素?

像列表一样支持索引,索引值从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)
...
2
4
6
8
10

如何切片?

使用切片运算符 :,只要是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 到 2nd
array('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 element
numbers[0] = 0    
print(numbers)     # Output: array('i', [0, 2, 3, 5, 7, 10])
# changing 3rd to 5th element
numbers[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 array
numbers.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 integer
numbers = 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 element
print(number) # Output: array('i', [1, 2, 3, 4])
del number # deleting entire array
print(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: 12
print(numbers)   # Output: array('i', [10, 11, 13])

 什么时候使用数组?

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

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

Ps:本文基于Python 3.8

相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
317 0
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
184 1
|
2月前
|
开发者 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
398 116
|
2月前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
415 119
|
2月前
|
Python
Python列表推导式:优雅与效率的艺术
Python列表推导式:优雅与效率的艺术
269 99
|
2月前
|
数据处理 Python
解锁Python列表推导式:优雅与效率的完美融合
解锁Python列表推导式:优雅与效率的完美融合
270 99
|
2月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
400 95
|
2月前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
|
2月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
123 1
|
2月前
|
大数据 开发者 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术

推荐镜像

更多