列表
1. 列表
Python列表是:
- 任意物件的有序集合:列表是收集其他物件的地方,列表維護了元素的每一項從左到右的順序,也就是說這是序列;
- 透過偏移訪問:像字串一樣,可以透過列表物件的偏移對其進行索引,從而讀取物件的某一部分的內容,也可以進行分片和拼接等操作;
- 可變長度、異構以及任意巢狀:列表可以在原位置增長或縮短(長度可變),並且可以包含任意型別的物件,支援任意的巢狀;
- 屬於可變型別的分類:列表是可變物件(可以在原位置修改),也可以進行索引、分片以及拼接(但進行這些操作時返回的是新列表),還支援刪除和索引賦值操作(會在原位置修改列表)
- 物件引用陣列:從技術上講,Python列表包含了一個或多個其他物件的引用。
1.1 常用列表字面量和操作
2. 列表的實際應用
2.1 列表基本操作
2.1.1 列表運算子
>>> len([1, 2, 3]) # 求列表長度
3
>>> [1, 2, 3] + [4, 5, 6] # 列表拼接
[1, 2, 3, 4, 5, 6]
>>> ['Ni!'] * 4 # 列表重複
['Ni!', 'Ni!', 'Ni!', 'Ni!']
2.1.2 列表迭代和推導
>>> 3 in [1, 2, 3]
True
>>> for x in [1, 2, 3]:
... print(x, end=' ')
...
1 2 3
>>> res = [c * 4 for c in 'SPAM']
>>> res
['SSSS', 'PPPP', 'AAAA', 'MMMM']
>>> list(map(abs, [-1, -2, 0, 1, 2]))
[1, 2, 0, 1, 2]
# map函式會對序列的每個元素應用函式abs,並返回結果
2.1.3 索引、分片和矩陣
對列表進行索引返回的是指定的偏移處的物件,而對列表進行分片返回的是一個新的列表:
>>> L = ['spam', 'Spam', 'SPAM']
>>> L[2]
'SPAM'
>>> L[-1]
'SPAM'
>>> L[1:]
['Spam', 'SPAM']
由於可以在列表中巢狀列表,因此需要多次索引才能找到最後的元素,巢狀了子列表的列表就可以表示矩陣:
>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> matrix[1]
[4, 5, 6]
>>> matrix[1][1]
5
>>> matrix[2][0]
7
2.1.4 原位置修改列表
索引和分片的賦值
當使用列表時,可以給一個特定項或整個分片來改變它的內容:
>>> L = ['spam', 'Spam', 'SPAM']
>>> L[1] = 'eggs'
>>> L
['spam', 'eggs', 'SPAM']
>>> L[0:2] = ['eat', 'more']
>>> L
['eat', 'more', 'SPAM']
索引和分片的賦值都是在原位置上修改,而不是生成一個新的列表作為結果。
分片賦值實際上包含兩步:
- 刪除:刪除等號左邊指定的分片;
- 插入:將包含在等號右邊的可迭代物件中的片段插入舊分片被刪除的位置;
分片賦值不需要保證刪除的元素數目與插入的元素數目相等!
>>> L = [1, 2, 3]
>>> L[1:2]
[2]
>>> L[1:2] = [4, 5] # 相當於替換2這個元素
>>> L
[1, 4, 5, 3]
>>> L[1:1] = [6, 7] # 相當於在索引1處插入列表[6, 7]中的元素
>>> L
[1, 6, 7, 4, 5, 3]
>>> L[1:2] = [] # 相當於刪除6這個元素
>>> L
[1, 7, 4, 5, 3]
>>> L = [1]
>>> L[:0] = [2, 3, 4] # 相當於在頭部插入
>>> L
[2, 3, 4, 1]
>>> L[len(L):] = [5, 6, 7] # 相當於在尾部插入
>>> L
[2, 3, 4, 1, 5, 6, 7]
列表方法呼叫
很多列表方法可以在原位置修改主體列表:
>>> L = ['eat', 'more', 'SPAM!']
>>> L.append('please')
>>> L
['eat', 'more', 'SPAM!', 'please']
>>> L.sort()
>>> L
['SPAM!', 'eat', 'more', 'please']
append
方法能夠將一個單獨的元素(物件引用)加至列表末端
sort
方法能將列表內的元素進行排序
列表排序
sort方法在原位置對列表進行排序,預設採用
<
進行比較排序。
list.sort(key=None, reverse=False)
- key:用於指定排序依據的函式,如果提供了
key
引數,列表中的每個元素會呼叫這個函式,並以其返回值作為排序的依據;- reverse:布林值。如果設定為
True
,列表將被反向排序(降序)。預設值是False
(升序)。>>> numbers = [2, 3, 1, 5, 4] >>> numbers.sort() >>> numbers [1, 2, 3, 4, 5] # 1. 逆序排序 >>> numbers.sort(reverse=True) >>> numbers [5, 4, 3, 2, 1] # 2. 指定key引數進行排序 >>> fruits = ['apple', 'banana', 'cherry'] >>> fruits.sort(key=len) >>> fruits ['apple', 'banana', 'cherry'] >>> fruits.sort(key=str.lower) >>> fruits ['apple', 'banana', 'cherry'] # 3. 自定義排序函式 >>> def sort_by_last_letter(word): ... return word[-1] ... >>> fruits.sort(key=sort_by_last_letter, reverse=True) >>> fruits ['cherry', 'apple', 'banana']
Python提供了
sorted
內建函式用於對可迭代物件進行排序,但與list.sort
方法不同,sorted
函式不會改變原始物件而是返回新的排序後的可迭代物件。
sorted(iterable, key=None, reverse=False)
iterable:任何可迭代物件(列表、字串、元組等)
key:用於指定排序依據的函式,如果提供了
key
引數,列表中的每個元素會呼叫這個函式,並以其返回值作為排序的依據;reverse:布林值。如果設定為
True
,列表將被反向排序(降序)。預設值是False
(升序);>>> sorted_numbers = sorted(numbers) >>> sorted_numbers [1, 2, 3, 4, 5] # 1. 逆序排序 >>> sorted_numbers = sorted(numbers, reverse=True) >>> sorted_numbers [5, 4, 3, 2, 1] # 2. 指定key進行排序 >>> fruits = ['apple', 'banana', 'cherry'] >>> sorted_fruits = sorted(fruits, key=len, reverse=True) >>> sorted_fruits ['banana', 'cherry', 'apple'] # 3. 自定義排序函式 >>> def sort_by_last_letter(word): ... return word[-1] ... >>> sorted_fruits = sorted(fruits, key=sort_by_last_letter) >>> sorted_fruits ['banana', 'apple', 'cherry']
其他常見列表方法
reverse
方法可以在原位置反轉列表extend
方法可以在列表末端插入多個元素pop
方法可以刪除並返回列表末尾的一個元素,pop
方法也能接收一個偏移量將偏移量對應的元素從列表中刪除並返回
內建的reversed
函式也可以將可迭代物件反轉,不過是返回反轉後的新的可迭代物件。
>>> L = [1, 2]
>>> L.extend([3, 4, 5])
>>> L
[1, 2, 3, 4, 5]
>>> L.pop()
5
>>> L
[1, 2, 3, 4]
>>> L.reverse()
>>> L
[4, 3, 2, 1]
>>> list(reversed(L))
[1, 2, 3, 4]
extend
方法 vsappend
方法
extend
方法總是會迴圈訪問傳入的可迭代物件,並逐個把產生的元素新增到列表末尾,而append
方法會直接把這個傳入的可迭代物件新增到尾部而不會遍歷它。
extend
方法可以向列表尾部新增多個元素,而append
方法只能新增一個。>>> L = [1, 2, 3] >>> L.extend([4, 5]) >>> L [1, 2, 3, 4, 5] >>> L = [1, 2, 3] >>> L.append([4, 5]) >>> L [1, 2, 3, [4, 5]]
remove
方法可以透過值刪除列表元素,不過只會刪除第一個匹配項,找不到該元素時會丟擲ValueError
異常insert
方法可以在某個偏移處插入元素count
方法可以計算某元素在列表中的個數index
方法可以查詢某元素的索引值,找不到該元素時會丟擲ValueError
異常clear
方法可以清除列表中的所有元素
>>> L = [0, 0, 1, 2, 3]
>>> L.remove(0)
>>> L
>>> L.remove(5) # 元素不存在時丟擲異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
[0, 1, 2, 3]
>>> L.insert(1, 4) # 在索引1處插入元素4
>>> L
[0, 4, 1, 2, 3]
>>> L.count(0)
1
>>> L.index(2)
3
>>> L.index(5) # 元素不存在時丟擲異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 5 is not in list
>>> L.clear()
>>> L
[]
其他常見列表操作
由於列表是可變型別,可以使用del
語句在列表原位置刪除某項或者某片段
>>> L = ['spam', 'eggs', 'ham', 'toast']
>>> del L[0]
>>> L
['eggs', 'ham', 'toast']
>>> del L[1:]
>>> L
['eggs']
也可以將列表切片賦值為[]
(空列表)來刪除,但是如果給列表某個索引賦值為[]
,將會在對應位置儲存空列表物件的引用而不是刪除該元素
>>> L = ['Already', 'got', 'one']
>>> L[1:] = []
>>> L
['Already']
>>> L[0] = []
>>> L
[[]]
列表的copy
方法可以實現一個列表的淺複製,作用類似[:]
和list(L)
>>> L = [1, 2, 3]
>>> L.copy()
[1, 2, 3]
>>> L.copy is L
False
>>> L[:]
[1, 2, 3]
>>> L[:] is L
False