(D06)Python-列表,深淺拷貝
列表 List
列表的比較運算:
運算子:
- < <= > >= == !=
說明:
- 列表的比較規則與字串的比較規則相同
- 列表要求每兩個元素能依次進行比較,否則會出現型別錯誤
示例:
[1, 2, 3] < [1, 2, 4] # True [1, 2, 3] != [1, 2, 4] # True ["One", "Two"] < ["1", "2"] # False [1, 'Two'] > ['Two', 1] # TypeError [1, "二", 3.14] < [2, "2", 1] # True
列表的in / not in 運算子
- 判斷一個值是否存在於列表中,如果存在則返回True,
- 否則返回False
- 同字串的 in 運算子類似
示例:
x = [1, 'Two', 3, "四"]
3 in x # True
"3" in x # False
10 not in x # True
列表的索引操作:
- 索引取值
- 語法:
- x = 列表[整數表示式]
- 用法:
- 等同於字串的索引(同樣分為正向索引和反向索引)
索引賦值
- 列表是可變的序列,可以通過索引賦值改變列表中的元素
語法:
- 列表[整數表示式] = 表示式
示例:
x = [1, 2, 3, 4]
x[2] = 1 + 2.14 # 改變了第三個元素的值
print(x)
列表的切片操作
- 切片取值
- 列表[起始索引:終止索引:步長]
- 列表的切片取值是從原列表中取出想要的元素再次組成一個新的列表
示例:
- L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- y = L[1:10:2] # y = [1, 3, 5, 7, 9]
切片的賦值操作
作用:
- 可以改變原列表的排列,可以插入,和修改資料
語法:
- 列表[切片] = 可迭代物件
說明:
-切片賦值的賦值運算子(=)的右側必須是一個可迭代物件
示例:
L = [2, 3, 4]
L[0:1] = [1.1, 2.2] # L=[1.1, 2.2, 3, 4]
L[0:2] = [2] # L = [2, 3, 4]
L[1:2] = [3.1, 3.2] # L = [2, 3.1, 3.2, 4]
L = [2, 3, 4]
L[1:1] = [2.1, 2.2] # L = [2, 2.1, 2.2, 3, 4]
L[0:0] = [0, 1] # L = [0, 1, 2, 2.1 ....]
L = [2, 3, 4]
L[3:3] = [5, 6] # L = [2, 3, 4, 5, 6]
L = [2, 3, 4]
L[1:2] = "AB" # L = [2, 'A', 'B', 4]
L[1:3] = range(7, 10) # L = [2, 7, 8, 9, 4]
切片的注意事項:
-
對於步長不等於1的切片賦值,賦值運算子的右側的可迭代物件
提供的元素的個數,一定要等於切片切出的段數L = [1, 2, 3, 4, 5, 6]
L[::2] = “ABC” # 對的
L[::2] = “abcd” # 錯的
del 語句
- 可以用於刪除列表的元素
語法:
- del 列表[整數表示式]
- del 列表[切片]
示例: - L = [1, 2, 3, 4, 5, 6, 7, 8]
- del L[-1] # L = [1, 2, 3, 4, 5, 6, 7]
- del L[1::2] # L = [1, 3, 5, 7]
練習:
已經有列表:
L = [3, 5]
用索引和切片操作,將原列表改變為:
L = [1, 2, 3, 4, 5, 6]
將列表反轉,結果如下:
L = [6, 5, 4, 3, 2, 1]
然後刪除最後一個元素,結果如下 :
L = [6, 5, 4, 3, 2]
寫一個程式.讓使用者輸入很多個正整數,當輸入負數時結束輸入
將使用者輸入的數字儲存於列表中
1. 列印存有數字的列表
2. 求出這些數字中的平均數
3. 求出這個數字中的最大數
如:
請輸入: 1
請輸入: 2
請輸入: 99
請輸入: 100
請輸入: -1
列印如下 :
列表是: [1, 2, 99, 100]
平均值是: 55.5
最大數是: 100
python3中常用於的序列的函式
len(x) 返回序列的長度
max(x) 返回序列的最大值元素
min(x) 返回序列中最小值元素
sum(x) 返回序列中所有元素的和(元素必須是數字型別)
any(x) 真值測試.如果列表中的一個值為真值則返回True
all(x) 真值測試.如果列表中所有的值為真值則返回True
示例:
L = ["Beijing", 1, 123]
print(len(L)) # 3
L = [8, 3, 6, 2]
print(max(L)) # 8
print(min(L)) # 2
print(sum(L)) # 19
練習:
寫一個程式,讓使用者輸入很多個正整數,當輸入小於零的數時
結束輸入
1) 列印這些數中最大的數
2) 列印這些數中第二大的數
3) 刪除最小的一個數
深拷貝 deep copy 和 淺拷貝 shallow copy
淺拷貝
-
淺拷貝是指在複製過程中,只複製一層變數,不會複製深層變數繫結的物件的複製過程
如:L = [3.1, 3.2] L1 = [1, 2, L] L2 = L1.copy() # 淺拷貝 print(L1) # [1, 2, [3.1, 3.2]] print(L2) # [1, 2, [3.1, 3.2]] L2[2][0] = 3.14 print(L1) # [1, 2, [3.14, 3.2]] print(L2) # [1, 2, [3.14, 3.2]]
深拷貝 deep copy
如:
import copy # 匯入複製模組
L = [3.1, 3.2]
L1 = [1, 2, L]
L2 = copy.deepcopy(L1) # 深拷貝
print(L1) # [1, 2, [3.1, 3.2]]
print(L2) # [1, 2, [3.1, 3.2]]
L2[2][0] = 3.14
print(L1) # [1, 2, [3.1, 3.2]]
print(L2) # [1, 2, [3.14, 3.2]]
列表與字串比較:
1. 列表和字串都是序列,元素之間有先後順序關係
2. 列表和字串有相同的操作: + += * *= < > in ...
3. 字串是不可變化的序列,列表是可變的序列
4. 字串的每個元素只能儲存字元,而列表可以儲存任意型別
的元素
5. 列表和字串都是可迭代物件
字串的文字解析方法 split 和join
- S.split(sep=None) 將字串使用sep作為分隔符分割s
字串,返回分割後的字串列表;當不給定參
數時,用空白字元作為分隔符 - S.join(iterable) 用可迭代物件中的字串生成一箇中
間用S進行分隔的字串
示例:
s = 'Beijing is Capital'
L = s.split(' ') # L = ['Beijing', 'is', 'Capital']
s2 = "##".join(L) # s2 = "Beijing##is##Capital"
列表推導式 list comprehesion
-
列表推導式是用可迭代物件建立列表的表示式
-
作用:
- 建立列表
-
語法:
- [ 表示式 for 變數 in 可迭代物件]
-
或
-
[ 表示式 for 變數 in 可迭代物件 if 真值表達式]
示例: -
生成一個數值為1~9的平方的列表
-
L = [x**2 for x in range(1, 10)]
-
L = [1, 4, 9, 16 … 64, 81]
-
生成一個數值1~9的平方的列表(只要其中奇數的平方)
-
L = [x**2 for x in range(1, 10) if x % 2 == 1]
-
L = [1, 9, 25, 49, 81]
-
以上列表推導式可以改寫為:
L = []
for x in range(1, 10):
if x % 2 == 1:
L.append(x**2)
列表推導式的巢狀語法:
[ 表示式
for 變數1 in 可迭代物件1 if 真值表達式1
for 變數2 in 可迭代物件2 if 真值表達式2
…]
如:
L = [x + y for x in "ABC" for y in "123"]
# L = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3',
'C1', 'C2', 'C3']
練習:
1. 有一些數存於列表中,如:
L = [1, 3, 2, 1, 6, 4, 2, ..... 98, 82]
1) 將列表中出現的數字存入到另一個列表L2中
要求:
重複出現多次的數字只能在L2中保留一份(去重)
2) 將列表中出現兩次的數字存於L3列表中,在L3列表中
只保留一份
2.生成一個列表,求 x 的平方+1的列表,跳過結果能被5整除的
數, (注: 0 <= x <= 100)
3. 把 0 ~ 100 之 間的所有素數存於一個列表中
即: L = [2, 3, 5, 7, 11, ..... 97]