# 列表和数组 虽然列表既灵活又简单,但对于对于各种需求时,可能会有更好的选择,比如,要存放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的类型码 |