Python-列表

N1rv2na發表於2024-07-02

列表

1. 列表

Python列表是:

  • 任意物件的有序集合:列表是收集其他物件的地方,列表維護了元素的每一項從左到右的順序,也就是說這是序列;
  • 透過偏移訪問:像字串一樣,可以透過列表物件的偏移對其進行索引,從而讀取物件的某一部分的內容,也可以進行分片和拼接等操作;
  • 可變長度、異構以及任意巢狀:列表可以在原位置增長或縮短(長度可變),並且可以包含任意型別的物件,支援任意的巢狀;
  • 屬於可變型別的分類:列表是可變物件(可以在原位置修改),也可以進行索引、分片以及拼接(但進行這些操作時返回的是新列表),還支援刪除和索引賦值操作(會在原位置修改列表)
  • 物件引用陣列:從技術上講,Python列表包含了一個或多個其他物件的引用。

1.1 常用列表字面量和操作

常用列表字面量和操作1

常用列表字面量和操作2

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方法 vs append方法

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

相關文章