[558]python3之数组(array)

时间:2024-10-25 12:12:52

/3.5/library/#module-array

当我们需要1000万个浮点数的时候,数组(array)的效率要比列表(list)要高得多,因为数组在背后存的并不是float对象,而是数字的机器翻译,也就是字节表述。这一点和c语言中的数组一样。

再比如说,如果需要频繁对序列做先出先进的操作,(双端队列)的速度应该会更快。

  • 1.数组

如果我们需要一个只包含数字的列表,那么比list更高效。数组支持所有跟可变序列有关的操作,包括.pop,.insert和.extend。

另外,数组还提供从文件读取和存入文件的更快的方法,如.frombytes和.tofile。

Python数组跟C语言数组一样精简。创建数组需要一个类型码,这个类型码用来表示在底层的C语言应该存放怎样的数据类型。比如b类型码代表的是有符号的字符(signedchar),array(‘b’)创建出的数组就只能存放一个字节大小的整数,范围从-128到127,这样在序列很大的时候,我们能节省很多空间。

一. array 模块就是数组,可以存放放一组相同类型的数字.

Type code C Type Python Type Minimum size in bytes Notes
‘b’ signed char int 1
‘B’ unsigned char int 1
‘u’ Py_UNICODE Unicode character 2 (1)
‘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 (2)
‘Q’ unsigned long long int 8 (2)
‘f’ float float 4
‘d’ double float 8

二. array 提供的方法如下

    append() -- append a new item to the end of the array
    buffer_info() -- return information giving the current memory info
    byteswap() -- byteswap all the items of the array
    count() -- return number of occurrences of an object
    extend() -- extend array by appending multiple elements from an iterable
    fromfile() -- read items from a file object
    fromlist() -- append items from the list
    frombytes() -- append items from the string
    index() -- return index of first occurrence of an object
    insert() -- insert a new item into the array at a provided position
    pop() -- remove and return item (default last)
    remove() -- remove first occurrence of an object
    reverse() -- reverse the order of the items in the array
    tofile() -- write all items to a file object
    tolist() -- return the array converted to an ordinary list
    tobytes() -- return the array converted to a string

如何构造一个array 对象

from array import array
import random 

# 构造方法如下
# (typecode[, initializer])

# 构造一个空的int类型数组
arr = array('i')

arr = array('i', [0, 1, 2, 3, 4, 6, 7, 8, 9, 100])

array('f',[ (-10,10) for  _ in range(10)])
Out[28]: array('f', [4.0, 6.0, -9.0, 7.0, -2.0, -7.0, -7.0, -5.0, -9.0, -10.0])
  • 常用方法介绍


用于创建数组的类型代码字符。上面的初始化数组的类型

arr2 = array('d',[2.3453,4.567])                                               

'd'


内部表示中一个数组项的字节长度。


包含所有可用类型代码的字符串。

import array
                                                              
'bBuhHiIlLqQfd'
(x)  
# 方法返回x 在数组中第一次出现的下标, 下标从零开始,如果没有找到该元素会报异常.
ValueError: (x): x not in list

array.buffer_info()  
Return a tuple (address, length) giving the current memory address 
-------------------------------------------------------------------------
# remove(element)  element 是要删除的元素,  该方法会删除第一次出现的元素, 如果有多次出现, 不会删除,如果希望删除所有的在array 中的元素,需要删除多次.
#  如果删除 的元素的不在 array 中, 则会抛异常  ValueError: (x): x not in list

(0)
arr
array('i', [1, 2, 3, 4, 6, 7, 8, 9, 100, 111, 222, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr
array('i', [2, 3, 4, 6, 7, 8, 9, 100, 111, 222, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 3, 4])
(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: (x): x not in list

删除array 所有的 1  
from array import array
def delete_array_element():
    arr = array('i', [1, 2, 1, 4, 1, 11, 1, 2, 1, 2, 0, 1, 2, 1, 4])
    while 1:
        try:
            (1)
        except ValueError:
            print('delete finished.')
            break
    print(arr)

if __name__ == '__main__':
    delete_array_element()
-------------------------------------------------------------------------
# count(x)
Return the number of occurrences of x in the array.
# 返回 x 在数组中出现的次数,没有该元素则返回0 

arr = array('i', [1, 2, 45, 1, 1, 1, 0, 12, 1, 4])
(1)
5
(2)
1
(100)
0
-------------------------------------------------------------------------
# pop  删除元素,默认删除下标-1 的元素,  也可以指定 删除的位置 
# pop(i)  指定 i  的位置
arr
array('i', [3, 4, 6, 7, 8, 9, 100, 111, 222, 0, 2, 3, 4, 5, 6, 7, 8, 9])
()
9
()
8
arr
array('i', [3, 4, 6, 7, 8, 9, 100, 111, 222, 0, 2, 3, 4, 5, 6, 7])

arr
array('i', [3, 4, 6, 7, 8, 9, 100, 111, 222, 0, 2, 3, 4, 5, 6, 7])
# 删除第一个元素,并且返回该元素
(0)
3
arr
array('i', [4, 6, 7, 8, 9, 100, 111, 222, 0, 2, 3, 4, 5, 6, 7])
#删除第3个元素 , 7 
(2)
7
arr
array('i', [4, 6, 8, 9, 100, 111, 222, 0, 2, 3, 4, 5, 6, 7])
-------------------------------------------------------------------------
## insert (i,v)  i 是小标, v 带插入的元素

arr = array('i', [1, 2, 1, 4, 1, 11, 1, 2, 1, 2, 0])
arr
array('i', [1, 2, 1, 4, 1, 11, 1, 2, 1, 2, 0])
(0,100)
arr
array('i', [100, 1, 2, 1, 4, 1, 11, 1, 2, 1, 2, 0])
(2,200)
arr
array('i', [100, 1, 200, 2, 1, 4, 1, 11, 1, 2, 1, 2, 0])
-------------------------------------------------------------------------
## append(v)
# append 默认从末尾追加元素, 在数组尾部添加元素
arr =array('f',range(4))
arr
array('f', [0.0, 1.0, 2.0, 3.0])
(66.66)
(66.67)
(66.68)
arr
array('f', [0.0, 1.0, 2.0, 3.0, 66.66000366210938, 66.66999816894531, 66.68000030517578])
-------------------------------------------------------------------------
# extend, 通过一个可迭代对象添加元素 
arr = array('i',range(4))
(range(10))
arr
array('i', [0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
-------------------------------------------------------------------------
##fromlist   从一个列表中添加元素
l1  = list(range(5,10))
arr = array('i',range(4))
arr
array('i', [0, 1, 2, 3])
l1
[5, 6, 7, 8, 9]
(l1)
arr
array('i', [0, 1, 2, 3, 5, 6, 7, 8, 9])
-------------------------------------------------------------------------
##  reverse 倒序一下,反转一下
arr
array('i', [0, 1, 2, 3, 5, 6, 7, 8, 9])

()
arr
array('i', [9, 8, 7, 6, 5, 3, 2, 1, 0])
-------------------------------------------------------------------------
## tolist 会根据array 的元素 返回一个list 
arr = array('i', [1, 2, 3, 4, 1, 11, 1, 22, 1, 2, 0, 1, 2, 1, 4])
()
[1, 2, 3, 4, 1, 11, 1, 22, 1, 2, 0, 1, 2, 1, 4]
-------------------------------------------------------------------------
# (s)  # 可以通过bytes 还原 array 对象  
# ()  # 可以把array 转成 bytes 的表示

def test_frombytes_tobytes():
    arr = array('i', [1, 2, 11, 1, 220, 12, 1, 4])
    arr_bytes = ()
    print(arr_bytes)

    arr2 = array('i')
    (arr_bytes)
    print(arr2)

# 结果如下
Connected to pydev debugger (build 173.4127.16)
b'\x01\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x01\x00\x00\x00\xdc\x00\x00\x00\x0c\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00'
array('i', [1, 2, 11, 1, 220, 12, 1, 4])
-------------------------------------------------------------------------
#  fromfile, tofile 这两个方法
(f, n)

# n 这个参数就是要读f读取多少个元素, 如果n> file中的个数 会报异常. 
EOFError: read() didn't return enough bytes

(f)
Write all items (as machine values) to the file object f.
# 这个方法就是把array 对象写到文件中. 

# 简单的一个例子
from array import array

if __name__ == '__main__':
    arr = array('i', [1, 2, 11, 1, 220, 12, 1, 4])
    # 注意这里要二进制方式打开wb
    with open('', 'wb') as f:
        (f)

    arr3 = array('i')
    print(arr3)
    # 注意这里要二进制方式打开
    with open('', 'rb') as f:
        (f, 8)
    print(arr3)

# result :
Connected to pydev debugger (build 173.4127.16)
array('i')
array('i', [1, 2, 11, 1, 220, 12, 1, 4])
-------------------------------------------------------------------------

array创建的数组不适用于数字操作(比如矩阵和矢量运算)。另外+=和*=运算符可以用于array的添加。

从python3.4开始,数组(array)类型不再支持诸如()这种就地排序方法。要给数组排序的话,得用sorted函数新建一个数组:

>>> import array
>>> a = (, sorted(a))
array 与内置list 有什么区别?

array 可以紧凑地表示一个基本值的数组:字符,整数,浮点数。数组是序列类型,表现得非常像列表,除了存储在它们中的对象的类型是受约束的。

1.首先array 是数组, 数组是只能够保存一种类型的数, 初始化的时候就决定了可以保存什么样的数. 而list 里面 几乎可以放任何对象,已经类型,无论是数字,还是字典,还是对象,还是列表,都可以同时放到一个列表里面.

和list 提供的方法很多是相似的, 比如 append, insert ,pop extend, index,等等

参考:/haoqirui/p/
/u010339879/article/details/81588215