列表 list
問題:
容器
如何將計算運算的數據臨時存在一個地方,同時又方便 添加,刪除,修改等操作?
什么是列表:
列表是一種容器
列表是可以被改變序列
列表是由一系列特定元素組成的,元素與元素之間可能沒有任何關聯關系,但他們之間有先后順序關系聯關系,但他們之間有先后順序關系
python3中序列類型簡介:
字符串 str 列表 list 元組 tuple 字節串 bytes 字節數組 bytearray
創始空列表的字面值
L = [] # L綁定空列表
注: 表達式[] 會創建一個空的列表
創建非空列表的字面值
L = [1,2,3,4] L = ["北京","上海","深圳"] L = [1,"Two",3.14,"四"] L = [1,2,[3.1,3.2],4]
列表的構造(創建)函數 list
list() # 創建一個空的列表,等同於[] list(iterable(可迭代)) # 用可迭代對象創建一個列表
# 示例: L = list() # L 綁定空列表等同於 L = [] L = list("hello") # L = ["h","e","l","l","o"] L = list(range(1,10,2)) # L = [1,3,5,7,9]
列表的運算
# 算術運算: + += * *=
# + 用於拼接列表 x = [1,2,3] y = [4,5,6] z = x+y # z = [1,2,3,4,5,6]
# += 將原列表與右側的可迭代對象的數據追加,得到新的列表 # 語法: # x += 可迭代對象 # 如: x = [1,2,3] x += [4,5,6] x += "ABC" x += range(1,10,3) # 注: # += 運算符是用原可迭代對象的數據進行追加,原列表的ID不變
# 如:
s = "ABC"
print(id(s)) #???
s += "123"
print(id(s)) # 和上面的不相同
L = [1,2,3]
print(id(L)) #???
L = "123"
print(id(L)) # ???
# * 生成重復的列表 x = [1,2] * 3 # x = [1,2,1,2,1,2]
# *= 生成重復的列表,用原變量綁定更新后的列表 x = [1,2,3] x = 2 #[1,2,3,1,2,3]
列表的比較運算:
# 運算符: < <= > >= == !=
說明:
列表的比較規則與字符串的比較規則相同
列表要求每兩個元素能依次進行比較,否則會出現類型錯誤
# 示例: [1,2,3] == [1,2,3] # True [1,2,3] != [1,3,2] # True [1,2,3] < [1,3,2] # True [1,2,3] >= [1,2] # True [1,"Two"] > ["Two",1] # TypeError (語法錯誤) [1,"two",3.14] < [1,"二",2.8] # True
列表是可迭代對象
L = [1,3,5,7] for x in L: print(x) # 打印 1 3 5 7
列表的 in / not in 運算符
判斷一個值是否存在於列表中,如果存在返回True,否則返回False
(同字符串的in和not in 用法相同)
not in 返回值與in 相反
# 示例: x = [1,"Two",3,"四"] 3 in x #True "3" in x #False 10 in x #False 10 not in x #True
練習:
寫一個程序,讓用戶輸入很多個正整數,當輸入負數時結束輸入,將用戶輸入的數存於列表L中,打印這個列表
如:
請輸入:1 請輸入:2 請輸入:3 請輸入:4 請輸入:-1
打印如下:
[1,2,3,4]
# L = [] x = int(input("請輸入:")) L += [x] # 把x 放在列表中,追加到L的末尾
L =[] # 創建一個列表,准備存放數字 while True: # 每次輸入一個數,如果次數小於0,則退出循環,否則把 # 這個數放在列表中 x= int(input("請輸入:")) if x < 0: break L += [x] print("列表的內容是:",L)
列表的索引操作
語法:
列表[整數表達式]
用法:
等用於字符串的索引
索引分為正向索引和反向索引,規則寫字符串索引規則完全相同
# 示例: L = [1,2,3,4] print(L[1]) #2 print(L[-1]) #4
# 注
# 列表是可變的序列, 列表支持索引賦值,列表可以通過索引賦值改變
列表中的元素
# 語法: # 列表[整數在表達式] = 表達式 # 示例: L = [1,2,3,4] L[2] = 3.14 # 改變了第三個元素的值
列表的切片操作
# 取值: # 列表[起始值:終止值] # 列表[起始值:終止值:步長] # 列表的切片取值返回一個列表,規則等同於字符串切片規則 # 示例; L = list(range(10)) L2 = L[::2] # L2 = (0,2,4,6,8)
列表的切片賦值
# 作用: # 可以改變源列表的排列,可以插入,修改和刪除數據 # 語法: # 列表[切片] = 可迭代對象 # 說明: # 切片賦值的賦值運算符(=)的右側必須是一個可迭代對象 # 示例: L = [2,3,4] L[0:1] = [1.1,2.2] # L = [1.1,2.2,3,4] L[2:] = [3.3,4.4,5.5] # L = [1.1, 2.2, 3.3, 4.4, 5.5] L[1:4] = [] # 切出 2.2,3.3,4.4 ,沒加入新數據 L[1:] = range(5,9) # L=[ 1.1, 5, 6, 7, 8] L = [2,5] L[1:1] = [3,4] # L=[2,3,4,5] L[0:0] = range(2) # L = [0,1,2,3,4,5] L[6:] =[6,7] # L = [0,1,2,3,4,5,6,7]
切片注意事項:
對於步長不等於1的切片賦值,賦值運算符的右側的可迭代對象提供的元素的個數,一定要等於切片的段數
L = [1,2,3,4,5,6] L[::2] = "ABC" #對的 L[::2] = "ABCDE" #錯的
# del 語句用於刪除列表的元素 # 語法: # del 列表[索引] #刪除索引 # del 列表[切片] #刪除切片 # 示例: L = [1,2,3,4,5,6,7] del L[-1] #L = [1,2,3,4,5,6] del L[::2] #L = [2,4,6]
# 練習; # 已知有列表: # L = [3,5] #(1)用索引和切片操作,將原列表改變為: # L = [1,2,3,4,5,6] l = [3,5]l[1:1] = [4]l[3:] = [6]l[len(l):] = [7] # 在長度最后一個插入l[0:0] =[1,2]print(l)
print(id(l))
#(2)將列表反轉,刪除最后一個元素后,打印此列表: # ... # print(L) #[6,5,4,3,2] # 將列表反轉 l[::] = l[::-1] #ID 不變 del l[-1] print(l)
print("l=",id(l))
python3 中常用於序列的函數:
len(x) # 返回序列的長度
max(x) # 返回序列的最大值元素
min(x) # 返回序列的最小值元素
sum(x) # 返回序列中所有元素的和(元素必須是數值類型)(全部相加)
any(x) # 真值測試,如果列表中其中一個值為真值則返回True
all(x) # 真值測試,如果列表中所有值為真值才返回True,否則返回False
# 序列函數
reversed(seq) # 返回原序列反向順序的可迭代對象
sorted(iterable,reverse=False) # 返回已排序的列表
# 示例: L = [8,3,6,2,7] print(len(L)) # 5 print(max(L)) # 8 print(min(L)) # 2 print(sun(L)) # 26 print(any(x)) # True print(all(x)) # True
# 示例: L = [1,2,3,4] for x in L: print(x) # 1 2 3 4 for x in reversed(L): print(x) # 4 3 2 1 L2 =[5,8,3,7,1] L3 = sorted(L2) # L3 = [1,3,5,7,8] L4 = sorted(L2,reverse=True) # 降序排序 L4 = [8,7,5,3,1]
練習:
# 1,寫程序,讓用戶循環輸入一些正整數,當輸入-1時結束輸入,將這些整數存於列表L中。 # 1)打印出你共輸入了幾個有效的數(不算結束的-1) # 2)打印你輸入的最大數是多少? # 3)打印你輸入的最小數是多少? # 4)打印你輸入的這些數的平均值是多少? l = []# 創建空列表 while True: n = int(input("請輸入整數:")) if n == -1: break # 停止輸入 l += [n] # 空列表加上轉N列表 print("已輸入:",l) print("你共輸入了%d個有效的數:"% len(l)) print("最大值是:",max(l)) print("最小值是:",min(l)) print("你輸入的這些數的平均值是:",sum(l)/len(l))
# 2.寫一個程序,讓用戶輸入兩個或以上的正整數,當輸入小於零的數時結束輸入(不允許輸入重復的數) # 1)打印這些數的和 # 2)打印這些數的最大數 # 3)打印這些數的最二大的數 # 4)刪除最小的一個數,並打原來的列表 l = [] # 創建一個容器,用變量來綁定 while True: n = int(input("請輸入整數:")) if n < 0: if len(l)<2: print("請重新輸入兩次以上整數") continue break if n not in l: l += [n] print('和是:',sum(l)) l = sorted(l) print("最大數是",l[-1]) print("最二大數是:",l[-2])
i = l[0]
for x in range(len(l)):
if l[x] == i:
del l[x]
break
print(l)
python3 中常用的列表方法
# 方法 # 意義 L.index(v [, begin[, end]]) # 返回對應元素的索引下標, begin為開始索引,end為結束索引,當 value 不存在時觸發ValueError錯誤 L.insert(index, obj) # 將某個元素插放到列表中指定的位置 L.count(x) # 返回列表中元素的個數 L.remove(x) # 從列表中刪除第一次出現在列表中的值 L.copy() # 復制此列表(只復制一層,不會復制深層對象) L.append(x) # 向列表中追加單個元素 L.extend(lst) # 向列表追加另一個列表 L.clear() # 清空列表,等同於 L[:] = [] L.sort(reverse=False) # 將列表中的元素進行排序,默認順序按值的小到大的順序排列 L.reverse() # 列表的反轉,用來改變原列表的先后順序 L.pop([index]) # 刪除索引對應的元素,如果不加索引,默認刪除最后元素,同時返回刪除元素的引用關系
練習:
# 練習: # 輸入多行文字,存入列表中 # 每次輸入后回車算作一行,任意輸入多行文字 # 當直接輸入回車(退空行時算作輸入結果) # 要求: # 1)按原輸入的內容在屏幕上輸出內容 # 2)打印出你共輸入了多少文文字 # 3)打印出你共輸入了多少行字符 # 如: # 請輸入:ABC # 請輸入:abc # 請輸入:123 # 請輸入:《回車》 # 你輸入的內容是: # ABC # abc # 123 # 你輸入了3行文字 # 你輸入了9個字符 l = [] while True: s = input("請輸入:") if not s: # 當輸用戶直接輸入回車時,得到空字符串 break l.append(s) # 將字符串s追加到l列表末尾 print(l) print("你輸入的內容是:") for text in l: print(text) print("你輸入了",len(l),"行文字") count = 0 for text in l: count += len(text) #把每一行字符串長度累加到count中 print("你輸入兩",count,"個字符")
深拷貝 和 淺拷貝
淺拷貝 shallow copy
# 淺拷貝是指在復制過程中,只復制一層變量,不會復制深層變量綁定的對象的復制過程 # 如: L1 = [1,2,[3.1,3.2]] L2 = L1.copy() L2[2][0] = 3.14 print(L1) # [1,2,[3.14,3.2]] print(L2) # [1,2,[3.14,3.2]]
深拷貝 deep copy
# 深拷貝會在復制過程中,逐漸復制深層對象,實現兩個對象的完全獨立 # 如: # deepcopy import copy #導入考拷貝模塊 L1 = [1,2,[3.1,3.2]] L2 = copy.deepcopy(L1) L2[2][0] = 3.14 print(L1) # [1,2,[3.1,3.2]] print(L2) # [1,2,[3.14,3.2]]
# 小結: L1 = [1,2,[3.1,3.2]] L2 = L1 #不拷貝 L3 = L1.copy() #淺拷貝 import copy L4 = copy.deepcopy(L1) # 深拷貝
列表與字符串比較:
列表和字符串都是序列,元素之間有先后關系
字符串中每個元素只能存儲字符,而列表可以存儲任意類型 的元素
字符串是不可變的序列,而列表是可變的序列
列表和字符串都是可迭代對象
字符串的文本解析方法
# 方法名 # 說明 S.split(sep=None) # 將字符串,使用sep作用分隔符分割S字符串返回分割后的字符串列表,當不給定參數時,用空白符作為分隔符 S.splitlines() # 將字符串接換行符“\n” 分為分隔符進行分割返回分割后的列表 S.join(iterable) # 用可迭代對象中的字符串,返回一個是中間 (在字符串中加上字符)用S進行分隔的字符串
# 示例: s = 'Beijing is capital' L = s.split() # L = ["Beijing","is","capital"] s2 = "-".join(L) # s2 = "Beijing-is-capital"
練習:
# 有字符串"hello" 生成字符串"h e l l o" 和"h- e-l-l-o" s = "hello" s2 = " ".join(s) s2 = "-".join(s)
創建列表的方法有幾種:
# 字面值: [1,2,3] # 構造函數: list(range(1,4))
列表推導式 list comprehension
列表推導式用可迭代對象創建列表的表達式
# 作用: # 用簡易方法生成列表 # 語法: # [表達式 for 變量 in 可迭代對象] # 或 # [表達式 for 變量 in 可迭代對象 if 真值表達式] # 示例: # 生成一個數值為1~9的整數的平方的列表,如: L = [1,4,9,16,25,36,49,64,81] # 用循環語句: L = [] for x in range(1,10): L.append(x ** 2)
練習:
# 用列表推導式生成 1~ 100 內所有奇數組成的列表結果是:[1,3,5,7,......,99] # 示例: 生成一個數值為1~9的奇數的平方的列表,如: L = [1,9,25,49,81] L = [x**2 for x in range(1,10)if x % 2 == 1]
列表推導式的嵌套:
# 語法: [表達式 for 變量1 in 可迭代對象1 if 真值表達式1 for 變量2 in 可迭代對象2 if 真值表達式2 ....]
# 示例: # 將列表[10,20,30] 中的元素與列表[1,2,3] 元素分別相加,將得到的元素放於一個列表中... L = [x+y for x in [10,20,30] for y in [1,2,3]] print(L) #[11,12,13,21,22,23,31,32,33]
練習:
# 用字符串"ABC"和"123" 生成如下列表: ["A1","A2","A3","B1","B2","B3","C1","C2","C3"] l = [x+y for x in "ABC" for y in "123"] print(l)
# 生成一個列表,此列表為x的平方加1不能被5整數的數的列表條件:(x ** 2 + 1) % 5 !=0 # x 的取值范圍是:0<= x < 100 l = [x for x in range(0,100) if (x **2 + 1 )% 5 !=0] print(l)