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