List&Tuple
List是一個可變序列類型。因此,您可以通過添加或刪除元素來更改給定的列表。元組是不變序列類型。你不能換一個元組。所以你必須創建一個新的。
- List
- 創建:listTmp = [] , listTmp = [‘listtmp’, 2017, 2018, 2019]
- 訪問:通過下標進行訪問(和字符串同樣可以使用切片),listTmp[0] , listTmp[1,3]
- 增加:append()、或者通過下標進行組合新增或刪除等操作。listTmp.append(2020) # ‘listtmp’, 2017, 2018, 2019, 2020
- 刪除:listTmp.pop()(該方法默認刪除最後一個)、 listTmp.remove(2018)(移除列表中某個值的第一個匹配項)、 del listTmp2
listTmp = [2, 5, 7, '2019', '2010', 'ABCD'] print(listTmp.pop()) listTmp.remove(7) print(listTmp) del listTmp[2] print(listTmp) ''' ABCD [2, 5, '2019', '2010'] [2, 5, '2010'] '''
- Tuple
- 創建:tupleTmp = () , tupleTmp = (‘listtmp’, 2017, 2018, 2019)
- 訪問:通過下標進行訪問(和字符串同樣可以使用切片),tupleTmp[0] , tupleTmp[1,3]
- 增加:元組中的元素值是不允許修改的,但我們可以對元組進行連接組合。
- 刪除:元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組。
tupleTmp = ('loak', 2017, 2018, 2019) print(tupleTmp[0]) tupleTest = 1 newTuple = tupleTmp + (tupleTest,) # 元組中的元素只能連接組合進行增加 print(newTuple)' del tupleTmp
列表和元組的運算
- 列表
列表對 + 和 * 的操作符與字符串相似。+ 號用於組合列表,* 號用於重複列表。
Python 表達式 | 結果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 長度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 組合 |
[‘Hi!’] * 4 | [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] | 重複 |
3 in [1, 2, 3] | True | 元素是否存在於列表中 |
for x in [1, 2, 3]: print(x, end=" ") | 1 2 3 | 迭代 |
- 元組
與字符串一樣,元組之間可以使用 + 號和 * 號進行運算。這就意味着他們可以組合和複製,運算後會生成一個新的元組。
Python 表達式 | 結果 | 描述 |
---|---|---|
len((1, 2, 3)) | 3 | 計算元素個數 |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | 連接 |
(‘Hi!’,) * 4 | (‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’) | 複製 |
3 in (1, 2, 3) | True | 元素是否存在 |
for x in (1, 2, 3): print (x,) | 1 2 3 | 迭代 |
內置函數
- 列表
序號 | 函數 | 描述 |
---|---|---|
1 | len(list) | 列表元素個數 |
2 | max(list)、min(list) | 返回列表元素最大、最小值 |
3 | list(seq) | 將元組轉換爲列表 |
4 | list.append(obj) | 在列表末尾添加新的對象 |
5 | list.count() | 統計某個元素在列表中出現的次數 |
6 | list.extend(seq) | 在列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表) |
7 | list.index(obj) | 從列表中找出某個值第一個匹配項的索引位置 |
8 | list.insert(index, obj) | 將對象插入列表 |
9 | list.pop([index=-1]) | 移除列表中的一個元素(默認最後一個元素),並且返回該元素的值 |
10 | list.remove(obj) | 移除列表中某個值的第一個匹配項 |
11 | list.reverse() | 反向列表中元素 |
12 | list.sort( key=None, reverse=False) | 對原列表進行排序 |
13 | list.clear() | 清空列表 |
14 | list.copy() | 複製列表 |
- 元組
序號 | 函數 | 描述 |
---|---|---|
1 | len(tuple) | 計算元組元素個數 |
2 | max(tuple)、min(tuple) | 返回元組元素最大、最小小值 |
3 | tuple(seq) | 將列表轉換爲元組 |
關於列表和元組的深淺複製
- Python對象和變量的管理
Python沒有C語言中的變量。在C語言中,變量不止是個名字,它是字節集合並真實存在於內存某個位置上。而在Python中,變量僅僅是指向對象的標籤。a = [1, 2, 3] # 表示我們創建了一個指引指向列表[1, 2, 3],但是a不是列表 b = a # 此時並沒有複製a所指引的列表。我們只是創建了一個新的標籤b,然後將其指向a所指向的列表。如果修改a,那你就同時修改了b,因爲它們指向同一個列表。 # 可以使用內建函數id()可以返回對象的唯一id。該id是對象的內存地址。 c = [] print(id(a)) print(id(b)) print(id(c)) '''輸出: 10784000 10784000 10304448 '''
-
五種複製方式的比較
import copy a = [[1], 2, 3] b = a[:] c = list(a) d = a * 1 e = copy.copy(a) f = copy.deepcopy(a) a[0].append(4) print('a ', id(a), a) print('a[:] ', id(b), b) print('list(a) ', id(c), c) print('a * 1 ', id(d), d) print('copy.copy(a) ', id(e), e) print('copy.deepcopy(a) ', id(f), f) ''' a 9303824 [[1, 4], 2, 3] a[:] 9304864 [[1, 4], 2, 3] list(a) 9004416 [[1, 4], 2, 3] a * 1 9304824 [[1, 4], 2, 3] copy.copy(a) 9304784 [[1, 4], 2, 3] copy.deepcopy(a) 9304744 [[1], 2, 3] '''
從以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四種方式複製列表結果都可以得到一個新的列表,但是如果列表中含有列表,所有b, c, d, e四個新列表的子列表都是指引到同一個對象上。只有使用copy.deepcopy(a)方法得到的新列表f纔是包括子列表在內的完全複製。
-
深複製
-
列表深複製:a[:]、list(list)、copy.deepcopy(a)
上例爲淺複製,如果需要深複製a指引的列表。我們必須創建新的列表,然後使用變量來指引它。可以使用切片a[:]或者list(list)來實現全複製。當使用copy.copy(a)時,如果a中嵌套有列表,則嵌套的列表是淺複製。a = [1, 2, 3] b = a[:] # b = list(a) # import copy # b = copy.deepcopy(a) print(id(a)) # 10652928 print(id(b)) # 10653408 使用a[:]已成功複製
-
其他注意事項
還接受生成器。切片筆記法不適用於生成器,因爲生成器是不可更改。因此不能generator[0]。>>> generator = (x * 3 for x in range(4)) >>> list(generator) [0, 3, 6, 9]
百分之九十的切片標記法都可以被list()代替。下次你看見[:]的時候試試使用list()替代,這樣可以讓代碼更加可讀。
複製內容參照文章
-
個人博客:Loak 正 - 關注人工智能及互聯網的個人博客
文章地址:Python基礎(二)—列表和元組