# 列表和数组
虽然列表既灵活又简单,但对于对于各种需求时,可能会有更好的选择,比如,要存放1000万个浮点数,数组(array.array)的效率要远远高于列表(list)。因为数组在底层存储的并不是float对象,而是数字的机器翻译码,也就是字节码。跟C中的数组一样。
# 数组数据类型
## 一、创建数组
数组array.array跟C数组一样精简。创建数组需要一个类型码,这个类型码用来表示在底层C中存储的数据类型。数组(array.array)是扁平序列,列表(list)是容器序列。数组只允许存储单一类型的数据。源自于C语言的数组。
| Type code | C type | Python type | Size in bytes |
| --------- | ------------------ | ----------- | ------------- |
| `'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'` | signed int | 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 | double | 8 |
```python
from array import array
import random
#构造方法
# array.array(typecode, [initializer])
#构造空int类型
arr1 = array('i')
#构造非空float类型
arr2 = array('f', [random.randrange(-10, 10) for _ in range(8)])
floats = array('d', (random.random() for i in range(10**7)))
floats[-1]
#0.10329948966085312
#将array数组写入文件对象
array.tofile()
#从文件对象读入array数组
array.fromfile()
```
## 二、数组方法
| 方法 | 列表 | 数组 | 描述 |
| ------------------------ | ---- | ---- | ------------------------------------------------------------ |
| s.\__add__(s2) | y | y | s+s2,拼接 |
| s.\__iadd__(s2) | y | y | s+=s2,就地拼接 |
| s.append(e) | y | y | 尾部添加一个元素 |
| s.byteswap | | y | 翻转数组内每个元素的字节码,转换字节序列 |
| s.clear() | y | | 删除所有元素 |
| s.\__contains__(e) | y | y | s中是否含有e |
| s.copy() | y | | 对列表对象浅复制 |
| s.\__copy__() | | y | copy.copy(),对数组对象浅复制 |
| s.count(e) | y | y | s中e出现的次数 |
| s.\__deepcopy__() | | y | copy.deepcopy(),对数组对象深复制 |
| s.\__delitem__(p) | y | y | 删除位置p元素 |
| s.extend(i) | y | y | 将可迭代对象i里的元素添加到尾部 |
| s.frombytes(b) | | y | 将压缩成机器码的字节序列读出添加到尾部 |
| s.fromfile(f, n) | | y | 将文件对象f内的机器码读入添加到尾部,最多添加n项 |
| s.fromlist(l) | | y | 将列表对象l的元素添加到尾部,如果发生TypeError异常,那么操作被取消 |
| s.\__getitem__(p) | y | y | s[p],读取位置p的元素 |
| s.index(e) | y | y | 返回e在序列中第一次出现的位置 |
| s.insert(p, e) | y | y | 在p位置的元素之前插入元素e |
| s.itemsize | | y | 数组中每个元素占的字节数 |
| s.\__iter__() | y | y | 返回迭代器 |
| s.\__len__() | y | y | len(s),返回序列长度 |
| s.\__mul__(n) | y | y | s*n,重复拼接 |
| s.\__imul__(n) | y | y | s*=n,就地重复拼接 |
| s.\__rmul__(n) | y | y | n*s,反向重复拼接 |
| s.pop([p]) | y | y | 删除并返回p位置的值,默认最后一个元素 |
| s.reverse() | y | y | 就地翻转元素位置 |
| s.\__resersed__() | y | | 返回一个从尾部开始的迭代器 |
| s.\__setitem__(p, e) | y | y | s[p]=e,位于p位置的元素替换成e |
| s.sort([key], [reverse]) | y | | 就地排序 |
| s.tobytes() | | y | 按bytes数据类型返回所有元素的对象 |
| s.tofile(f) | | y | 将数组对象s写入文件对象f |
| s.tolist() | | y | 将数组对象s转换为列表对象 |
| s.typecode | | y | 返回数组对象s的类型码 |