Python 序列型別 list,tuple,range 使用說明
Python 序列型別
Python 中存在很多的序列(Sequence
)型別,比如str
,bytes
,list
,tuple
,range
。其中串列list
繼承自MutableSequence
,為可變序列,元組tuple
和區域range
繼承自Sequence
,為不可變序列。
判斷 Python 序列是否相等的規則
對於型別相同的兩個 Python 序列,如果他們的長度一樣,每一個位置的元素相等,則這兩個序列是相等(==
)的。
文字/字串型別
想要詳細了解 Python 字串型別,你可以檢視Python 文字/字串型別 str 使用說明一節。
Python list 型別
Python 中的串列list
也被稱為清單,可以通過[]
來建立,[]
中為串列的元素,元素之間使用,
進行分隔。
除了[]
,你還可以通過list
型別的建構子來建立 Python 串列,他的形式如下。
list([iterable], /)
- iterable 參數
iterable
參數是一個疊代器物件,疊代器中的元素將依次包含在 Python 串列中。如果未指定該參數,則傳回一個空白串列。
另外,使用綜合運算可以讓建立串列變得更為簡單,語法格式為y for x in iterable
,其中iterable
為疊代器物件,x
表示疊代器中的元素,y
為一個運算式,一般會通過x
產生新的值。
[1, 2, 3]
[1, 2, 3]
list((1, 2, 3))
[1, 2, 3]
[x + 100 for x in (1, 2, 3)]
[101, 102, 103]
對 Python 串列中的元素進行排序
使用 Python 的sorted
函式,或串列物件的sort
方法,可以對串列中的元素進行排序,兩種方式的區別在於,sorted
函式會將排序的結果作為新的串列傳回。
sorted(iterable, /, *, key=None, reverse=False)
sort(*, key=None, reverse=False)
- iterable 參數
iterable
參數是一個疊代器物件,疊代器中的元素將參與排序。- key 參數
key
參數是一個函式或方法,其參數表示序列中的元素,其傳回值表示真正用於比較的內容,這對於複雜物件是有效的。假設串列的元素是Student
類別的執行個體,我們可以通過key
參數指示按照其id
進行排序。- reverse 參數
reverse
參數預設為False
,表示遞增排序,如果為True
,則表示遞減排序。
在下面的互動模式中,'A'
在排序後成為了串列的第一個元素,將str
型別的upper
方法傳遞給參數key
,對比內容被改為大寫字母,因此位置不再發生變化。
l = ['a', 'A', 'c']
l.sort()
l
['A', 'a', 'c']
l = ['a', 'A', 'c']
l.sort(key=str.upper)
l
['a', 'A', 'c']
Python tuple 型別
Python 中的元組tuple
,可以通過()
來建立,()
中為元組的元素,元素之間使用,
進行分隔。與串列不同,元組在建立之後不能修改。
建立 Python 元組時可以省略 ()
事實上,要建立一個 Python 元組僅需要使用,
,左右兩邊的括弧是可以省略的,書寫1,2,3
與書寫(1,2,3)
的效果是相同的。
不過,還是建議將()
保留,以避免產生意想不到的問題,比如fun(1,2)
和fun((1,2))
,第一個函式呼叫中的1,2
會被視為兩個參數,而不是一個元組。
使用 , 確保建立 Python 元組的運算式沒有歧義
當你建立只有一個元素的元組時,可以在元素後新增,
,否則運算式的計算結果可能是元素對應的值,而非一個元組。比如,(1)
傳回的結果為1
。
除了()
,你還可以通過tuple
型別的建構子來建立 Python 元組,他的形式如下。
tuple([iterable], /)
- iterable 參數
iterable
參數是一個疊代器物件,疊代器中的元素將依次包含在 Python 元組中。如果未指定該參數,則傳回一個空元組。
1,
(1,)
tuple([1, 2, 3])
(1, 2, 3)
Python range 型別
Python 中的區域range
,並不像串列和元組一樣包含具體的元素,range
僅包含一些資訊,用於描述一個有規律的整數序列,通常情況下這些整數會被用於迴圈。
要建立range
物件,需要使用range
型別的建構子,他具有以下兩種形式。
range(stop, /)
range(start, stop, step=1, /)
- start 參數
start
參數表示整數序列中的第一個整數,預設為0
。- stop 參數
stop
參數用於限定序列最後一個整數的大小,如果step
為正數,則最後一個整數需要小於stop
,如果step
為負數,則最後一個整數需要大於stop
。- step 參數
step
參數表示了序列中兩個整數的間距大小,預設為1
。如果設定為0
,將引發例外狀況ValueError
。
對於 Python 3.3 以及更高的版本,上述三個參數start
,stop
和step
,在成功建立range
物件後,其資訊將保留在對應的屬性start
,stop
和step
中。
判斷 Python range 物件相等的規則
兩個range
物件是否相等(==
),取決於他們表示的整數序列是否相等,而不是start
,stop
,step
屬性是否相等。比如,range(1,5,3)
和range(1,6,3)
相等,因為他們的長度相同,都包含了1
和4
,並且順序一致。
[x for x in range(3)]
[0, 1, 2]
tuple(range(10, 3, -2))
(10, 8, 6, 4)
range(0) == range(0, 0, -3)
True
取得 Python 串列,元組,區域中的元素
使用索引和配量運算式,你可以輕松取得 Python 串列,元組,區域(range
)的某個或某些元素,他們的書寫方式有s[i]
,s[i:j]
,s[i:j:k]
。
其中,i
,j
為元素的索引,用於界定配量的範圍,i
指示配量的開始位置,j
指示配量的停止位置,停止位置的元素不會被包含在配量中,如果停止位置存在元素的話。k
為間距,不能為0
,未指定或為None
時將作為1
處理。
根據k
的正負情況,i
指示的位置應該在j
指示位置的左邊或右邊,否則會傳回一個空配量。當i
,j
未指定或為None
時,配量會嘗試包含序列兩端的所有元素。
Python 串列,元組,區域中第一個和最後一個元素的索引
對於 Python 串列,元組,區域的第一個元素,其索引為0
。對於 Python 串列,元組,區域的最後一個元素,其索引可用-1
表示,倒數第二個元素的索引為-2
,以此類推。
(1, 2, 3, 4, 5)[-1]
5
(1, 2, 3, 4, 5)[-2:1:-1]
(4, 3)
(1, 2, 3, 4, 5)[:]
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)[100:-100:-2]
(5, 3, 1)
尋找 Python 串列,元組,區域中的元素
對於元素的尋找,Python 串列,元組,區域(range
)提供了如下方法。
count
方法用於取得指定元素在序列中出現的次數。
count(value, /)
- value 參數
value
參數為需要計算出現次數的元素。
index
方法用於取得指定元素在序列中的索引,如果元素不存在,則將引發例外狀況ValueError
。
index(value[, start[, stop]], /)
- value 參數
value
參數為需要計算索引的元素。- start,stop 參數
start
和stop
參數用於序列的配量操作,如果value
指定的元素不在配量範圍內,則會引發例外狀況ValueError
。
['a', 'b', 'b'].count('b')
2
(1, 'a', 1.3).index('a')
1
取得 Python 串列,元組,區域中元素的個數
Python 中的函式len
,可用於取得串列,元組,區域(range
)的元素個數,比如,len(range(3))
的運算結果為3
。
判斷 Python 串列,元組,區域中是否存在某個元素
使用x in s
或x not in s
,可以判斷串列,元組,區域(range
)中是否存在或不存在某個元素,x
為需要判斷的元素,s
為序列物件。
1 in [0, 1, 2]
True
1 not in (0, 1, 2)
False
取得 Python 串列,元組,區域中的最大值和最小值
Python 中的函式max
,min
,可用於取得串列,元組,區域(range
)中的最大值和最小值,比如,max([1,3,2])
的運算結果為3
,min((1,3,2))
的運算結果為1
。
反轉 Python 串列,元組,區域
使用 Python 串列的reverse
方法,可以將串列中的元素順序反轉,需要指出,這會直接影響原有串列,而不是產生新的串列物件。
如果你不希望影響原有串列,那麽可以使用reversed
函式,將反轉的結果儲存在疊代器中,然後通過疊代器建立一個新串列。或者,先使用copy
方法對原有串列進行複製。
除了串列,reversed
函式同樣適用於元組和區域(range
)。
l = [1, 2, 3]
l.reverse()
l
[3, 2, 1]
tuple(reversed((1, 2)))
(2, 1)
聯結 Python 串列,元組,區域
在 Python 中,你可以使用+
或*
,對串列,元組,區域(range
)進行聯結或自我聯結,他們的書寫方式為s+t
,s*n
,n*s
。其中s
和t
需要是型別相同的兩個序列物件,否則會引發例外狀況。n
為自我聯結的次數,大於1
時才有實際效果,如果次數小於等於0
,則會建置一個型別相同的空序列。
(1, 2) * 2
(1, 2, 1, 2)
(1, 2) * -1
()
使用 + 或 * 聯結 Python 串列,元組,區域會產生新的執行個體
無論是使用+
還是*
進行聯結,原有的運算元都不會受到影響,運算結果將作為新的序列物件傳回。
Python 串列,元組中的元素可能指向同一個物件
類似於([],)*2
這樣的運算式是很容易讓人誤解的,雖然其運算結果被表述為([],[])
,但元組的兩個元素指向了同一個串列,而不是兩個不同的串列。因為([],)
作為運算元被優先計算,元組的唯一元素保持了對串列的參考,在*2
進行自我聯結後,第二個元素與第一個元素將保持相同的參考。
在下面的互動模式中,為串列新增數值123
後,兩個元素的顯示資訊均發生了變化。
t = ([],) * 2
t
([], [])
t[0].append(123)
t
([123], [123])
新增和插入 Python 串列元素
對於元素的新增和插入,Python 串列提供了如下方法。
append
方法用於在串列的末尾新增元素。
insert
方法用於在串列的某一位置插入元素。
append(object, /)
insert(index, object, /)
- object 參數
object
參數為需要新增或插入的元素。- index 參數
index
參數是一個索引,該索引對應的位置將被插入元素。當index
表示的索引無效時,元素會被新增至串列末尾。
l = []
l.append(1)
l.insert(0, 2)
l
[2, 1]
取代和刪除 Python 串列中的元素
你可以使用之前講述的配量運算式,來取代 Python 串列中的元素,他們的書寫方式有s[i]=x
,s[i:j]=t
,s[i:j:k]=t
。
其中,x
為取代的新元素,t
為包含新元素的疊代器,配量運算式對應的舊元素會被刪除,新元素將在第一個舊元素的位置被依次新增。如果間距k
最終未被視為1
,則刪除的舊元素和新增的新元素的個數必須相同,否則刪除的舊元素和新增的新元素的個數不必相同。
使用del
關鍵字或空的疊代器,你可以刪除 Python 串列中的某個或配量包含的元素,他們的書寫方式有del s[i]
,del s[i:j]
,del s[i:j:k]
,s[i:j]=()
,s[i:j]=[]
等。
此外,串列的remove
方法可用於刪除指定的元素,刪除操作僅執行一次。
串列的pop
方法,同樣可用於刪除串列中指定索引位置的元素,但他會將被刪除的元素作為傳回值傳回。
串列的clear
方法可用於刪除串列中的所有元素。
remove(value, /)
- value 參數
value
參數為需要被刪除的元素,如果他不存在,則將引發例外狀況ValueError
。
pop(index=-1, /)
- index 參數
index
參數為需要刪除並傳回的元素的索引,預設為-1
,也就是最後一個元素的索引。當index
表示的索引無效時,將引發例外狀況IndexError
,這包括串列長度為0
的情況。
l = [1, 2, 3, 4, 5, 6]
l[0:2] = ('a', 'b', 'c')
l
['a', 'b', 'c', 3, 4, 5, 6]
del l[-1:-5:-1]
l
['a', 'b', 'c']
l.remove('b')
l
['a', 'c']
l.pop(0)
'a'
複製 Python 串列
使用 Python 串列的copy
方法,可以對串列進行複製,並產生一個新的串列,這種複製屬於陰影複製,複製的串列與被複製的串列互不影響,但兩個串列中的元素仍可能保持對同一物件的參考。
a = [1, 2, 3]
b = a.copy()
a.clear()
a
[]
b
[1, 2, 3]
拓展 Python 串列
使用+=
,*=
,你可以進行拓展和自我拓展,他們的書寫方式為s+=t
,s*=n
。其中s
為序列物件,t
為包含元素的疊代器物件。n
為自我拓展的次數,大於1
時才有實際效果,如果次數小於等於0
,串列中的元素將被清空。
此外,串列的extend
方法也可以實作串列的拓展,他的效果與s+=t
一致。
extend(iterable, /)
- iterable 參數
iterable
參數是一個疊代器物件,疊代器中的元素將被依次新增至串列末尾。
l = [1, 2]
l += range(3, 9)
l
[1, 2, 3, 4, 5, 6, 7, 8]