Python并沒有像其他語言那樣直接提供了數組(array)這種數據結構,而是通過導入array模塊來完成數組的相關操作。
在Python中沒有直接引入數組,也是由于Python中提供了列表這種數據結構,支持像數組一樣的元素插入、修改和刪除等操作。
但Python列表中的元素可以具有不同的數據類型,這一點與數組是不同的。如果想即使如此,額外提供一種數據結構來解決這種問題也沒有必要。
Python中的array模塊允許我們創建一個具有數據類型約束的數組,而且Python的array模塊僅支持幾類數據類型。其支持的數據類型主要有以下幾種:
類型碼 | 對應的C類型 | Python類型 | 最小字節數 |
---|---|---|---|
'b' | signed char | int | 1 |
'B' | unsigned char | int | 1 |
'u' | Py_UNICODE | Unicode character | 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' | float | float | 8 |
其中,'u' 對應Python中已過時的unicode字符(Py_UNICODE),這種類型在Python3.3中被棄用,也將在4.0中被刪除。如此以來,在array模塊中只剩下整數類型或float類型。
在創建和使用數組時,首先需要引入array模塊。
創建數組的語法格式如下:
array.array( typecode[, initializer])
其含義是使用typecode給出數組元素的類型,并由initializer進行初始化。
typecode參數即是上表給出的類型碼,用于指定數組元素的類型。
initializer是可選參數,用于初始化數組的參數,該參數必須是一個列表,或字節類對象或可迭代類型。
下面給出一些具體的例子。
import array
array1 = array.array('i', [11,12,13,14])
array2 = array.array('B', [97,98,99,49,50])
array3 = array.array('f', [1.1,1.2,1.3,1.4])
上面的例子創建了2個整型數組單精度的浮點數數組。
雖然,'B'在C中對應的是無符號字符類型,但在Python中對應的是int類型,所以其元素的類型需要是整數類型。
下面使用print輸出數組的類型及用于初始化的元素,同時使用typecode屬性可以獲取創建數組時指定的類型字符。
print(array1)
print(array2)
print(array3.typecode)
print(array2.typecode)
print(type(array2))
輸出結果如下:
array('i', [11, 12, 13, 14])
array('b', [97, 98, 99, 49, 2])
f
b
<class 'array.array'>
上面的例子中,type()函數是一個內置函數,用于輸出對象的類型。
我們可以使用循環語句輸出數組中的每個元素,也可以使用數組索引來訪問數組中的特定元素。
import array
ara = array.array('i', [11,12,13,14])
for e in ara:
print(e)
print(f'ara[2] = {ara[2]}/n') #輸出索引為2的元素值
#使用索引循環輸出每個元素
for i in range(0, len(ara)):
print(f'ara[{i}] = {ara[i]}')
結果如下:
11
12
13
14
ara[2] = 13
ara[0] = 11
ara[1] = 12
ara[2] = 13
ara[3] = 14
注意:python的數組索引也是從0開始的,如果索引越界,將引發IndexError錯誤。
我們可以使用insert()函數在數組指定索引處插入一個新元素,指定索引處的原元素將向后(右)移動一個位置。insert()函數的語法格式如下:
array.insert(i, x)
在數組 array 的 i 位置之前插入一個新元素 x 。 i 代表插入的位置, x 代表要插入的元素值。
我們也可以使用append()函數在數組末尾追加一個元素。append()函數的語法格式如下:
array.append(x)
在數組array的尾端追加一個新元素 x 。即, x 為要追加的元素值。
下面是兩個函數使用的一個例子:
import array
a = array.array('i',[11,12,13,14])
print(f'原數組:{a}')
a.insert(2, 131)
print(f'插入元素后:{a}')
a.append(15)
print(f'追加新元素后:{a}')
輸出結果如下:
原數組:array('i', [11, 12, 13, 14])
插入元素后:array('i', [11, 12, 131, 13, 14])
追加新元素后:array('i', [11, 12, 131, 13, 14, 15])
我們可以使用remove()函數刪除指定的元素。remove函數的語法格式如下:
array.remove(x)
該函數的作用是從數組array中刪除第一個值為 x 的元素。
import array
array4 = array.array('i', [11,12,13,14,13])
print(f'刪除前:{array4}')
array4.remove(13)
print(f'刪除后:{array4}')
執行結果如下所示:
刪除前:array('i', [11, 12, 13, 14, 13])
刪除后:array('i', [11, 12, 14, 13])
我們也可以使用pop()函數移除指定位置處的元素。pop函數的語法如下:
return_value = array.pop([i])
該函數的作用是移除索引 i 處的元素,并返回該元素值。 i 默認為 -1,即省略i時,默認是移除數組尾端的元素。
import array
array5 = array.array('i', [11,12,13,14,15])
print(f'操作前:{array5}')
rtn = array5.pop()
print(f'操作后:{array5},移除的元素為:{rtn}')
rtn = array5.pop(2)
print(f'array5.pop(2)={rtn},操作后的數組:{array5}')
運行的結果如下:
操作前:array('i', [11, 12, 13, 14, 15])
操作后:array('i', [11, 12, 13, 14]),移除的元素為:15
array5.pop(2)=13,操作后的數組:array('i', [11, 12, 14])
注意:在使用remove進行操作時,如果指定的元素值在數組中不存在時會引發ValueError錯誤。
我們可以使用Index()函數在數組中查找指定的元素值。index()函數的語法格式如下:
array.index(x[, start[, stop]])
其中,x為要查找的元素值,start為搜索的起始位置,stop為搜索的停止位置。
該函數將返回第一個匹配的元素索引,如果數組中不存在指定的x值,將引發ValueError錯誤。
下面是index()函數使用的一個例子:
import array
array6 = array.array('i',[11,12,13,14,15])
pos = array6.index(13)
try:
print(f'13的索引是{pos}')
except ValueError as ve:
print('數組中不存在13')
運行結果如下:
13的索引是2
我們可以使用數組索引的方式通過賦值來修改數組指定索引處的值。
import array
array7 = array.array('i', [11, 12, 13, 14, 15])
array7[2] = 3
array7[3] = 4
print(f'修改后的數組為:{array7}')
try:
array7[5] = 5
except IndexError as ie:
print('數組索引使用出現錯誤。')
輸出結果如下:
修改后的數組為:array('i', [11, 12, 3, 4, 15])
數組索引使用出現錯誤。
我們可以使用extend()函數將一個可迭代對象追加到數組的尾端。
extend()函數的語法格式如下:
array.extend(iterable)
從iterable中為數組尾端追加新元素。如果iterable是數組的話,iterable必須與被追加元素的數組具有相同的類型碼,否則,將引發TypeError錯誤;如果iterable不是數組,則iterable必須是可迭代的,同時iterable的元素類型需與數組具有相同的類型。
import array
array8 = array.array('i', [11,12,13])
array9 = array.array('i', [14,15,16,17])
array8.extend(array9)
print(array8)
array9.extend([18,19])
print(array9)
array9.extend(set([20,21,22]))
print(array9)
輸出結果如下:
array('i', [11, 12, 13, 14, 15, 16, 17])
array('i', [14, 15, 16, 17, 18, 19])
array('i', [14, 15, 16, 17, 18, 19, 20, 21, 22])
數組也支持負向索引,即從后端開始訪問數組中的元素。數組元素、正向索引及負向索引的關系可以由下圖來表示。
import array
array_a = array.array('i', [11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
print(f'array_a[9] = {array_a[9]}');
print(f'array_a[-1] = {array_a[-1]}');
輸出結果如下:
array_a[9] = 20
array_a[-1] = 20
Python數組也支持切片操作,返回數組若干元素的一個新數組。此操作不會改變原數組。同時切片操作也支持負向索引。
import array
array_b = array.array('i', [1, 2, 3 ,4, 5, 6, 7])
print(array_b[2:])
print(array_b[2:5])
print(array_b[:4])
print(array_b[-3:])
print(array_b[-5:-2])
print(array_b[:-2])
輸出結果如下:
array('i', [3, 4, 5, 6, 7])
array('i', [3, 4, 5])
array('i', [1, 2, 3, 4])
array('i', [5, 6, 7])
array('i', [3, 4, 5])
array('i', [1, 2, 3, 4, 5])
關于Python切片操作的更多知識可以參看本站中的另外一篇文章:全面掌握Python字符串切片方法
我們可以使用count()函數返回數組中特定元素的個數。
import array
array_c = array.array('i', [11,12,11,13,12,11])
print(array_c.count(11)) # 3
print(array_c.count(15)) # 0
我們可以使用reverse()函數對數組進行翻轉操作。即翻轉數組元素的順序。
import array
array_d = array.array('i', [11, 12, 13, 14, 15])
array_d.reverse()
print(array_d)
輸出結果如下:
array('i', [15, 14, 13, 12, 11])
我們可以使用tolist()函數把數組轉換成具有相同項的普通列表。
import array
array_e = array.array('i', [11, 12, 13, 14, 15])
lst = array_e.tolist()
print(lst)
輸出結果如下:
[11, 12, 13, 14, 15]
我們可以使用Python內置函數len()獲取數組中元素的個數。
import array
array_f = array.array('i', [11, 12, 13, 14, 15])
print(len(array_f)) # 5
我們可以使用array.itemsize來獲取數組中每個元素所占的字節數。
import array
array_g = array.array('i', [11, 12, 13, 14, 15])
print(array_g.itemsize) # 4
array_h = array.array('q', [11, 12, 13, 14, 15])
print(array_h.itemsize) # 8
新聞熱點
疑難解答