python3基礎06
day06
列表的in / not in運算子
判斷一個值是否存在於列表中,如果存在返回True,否則返回False
同字串的in 運算子
用於檢查一個值是否存在與列表中,如果存在返回True,否則返回False
示例:
x = [1, 'Two', 3, '四']
3 in x # 返回 True
'3' in x # 返回 False
10 in x # False
10 not in x # True
列表的索引操作
語法:
列表[整數表示式]
用法:
與字串索引的用法相同(分為正向索引和反向索引)
示例:
x = [1,3,5,7]
print(x[1]) # 3
print(x[-1]) # 7
列表的索引賦值:
列表時可變的,可以通過索引賦值改變列表中的元素
語法:
列表[整數表示式] = 表示式
作用:
改變列表中索引的繫結關係
示例:
x = [1,2,3,4]
x[2] =3.14 # 改變了第三個元素的值
列表的切片
列表[:]
列表[::]
列表的切片取值返回一個新的列表,規則等同於字串切片規則
示例:
x = [1,2,3,4,5,6,7,8]
x[::2] #[1,3,5,7]
y = [1::3] #[2,5,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[:]=[3,4] # l = [3, 4]
# 在列表首部填加
l = [3, 4]
l[0:0]=[1,2] # l = [1, 2, 3, 4]
l = [3,4]
l[1:1]=[3.14] # l = [3, 3.14, 4]
# 在列表尾部填加
# 切片賦值支援索引越界(向後新增)
l = [3,4]
l[2:2]=[5, 6]
l[-1:-1]=[5,6] # l = [3, 4, 5, 6]
# 切片賦值可以全部清空
l = [3,4]
l[::]=[] # l = []
#字串為可迭代物件,進行依次取值
l = [2, 3, 4]
l[1:2]='ABC' # l = [2, 'A', 'B', 'C', 4]
#切片賦值可以取可迭代物件range
l = [2, -1, 7]
l[1:2]=range(3,7) # l = [2,3,4,5,6,7]
切片的注意事項:
對於步長不等於1 的切片賦值,賦值運算子的右側的可迭代物件提供元素的 個數不一定要等於切片切出的段數
示例:
l = [1,2,3,4,5,6,7,8]
l[1::2] = 'ABCD' # 對的
# l = [1, 'A', 3, 'B', 5, 'C', 7, 'D']
l[1::2] = 'ABCDE' # 錯的
del語句用來刪除列表的元素
(對變數所繫結的列表進行操作)
語法:
del 列表[索引]
如: del L[0]
del 列表[切片]
如: del L[1::2]
練習一:
已知有列表:
l = [3,5]
用索引和切片操作,將原列表改變為:
l = [1,2,3,4,5,6]
將列表反轉,刪除最後一個元素後列印此列表
....
print(l) #[6,5,4,3,2]
python 3中常用於序列的函式
len(s) 返回序列的長度
max(x) 返回序列的最大值元素
min(x) 返回序列的最小值元素
sum(x) 返回列中所有元素的和(元素必須是數值型別)
any(x) 真值測試,如果列表中其中一個值為真值則返回True (與or相近)
all(x) 真值測試,如果列表中所有值為真值返回True (與and相近)
示例:
L = [3, 1, 9, 7, 5]
print(len(L)) # 5
print(max(L)) # 9
print(min(L)) # 1
print(sum(L)) # 25
練習二:
寫程式,讓使用者迴圈輸入一些整數,當輸入-1時結束,
將這些整數存於列表l中
1)列印您共輸入了多少個有效的數?
2)列印您輸入的最大數是?
3)列印您輸入的最小數是?
4)列印您輸入的這些數的平均值是多少?
python3中常用的列表的放法:
詳見:>>>>help list
文件資料:list.html
L.index(v [, begin[, end]])返回對應元素的索引下標
l=[1,3,5,7]
l.index(3) #1
l=[1,3,4,5,7,3,8,9]
l.index(3)=1
l.index(3,2) #5
L.insert(index, obj) 將某個元素插放到列表中指定的位置
l=[1,3,4,5,7,3,8,9]
l.insert(2,2) #l=[1,3,2,4,5,7,3,8,9]
L.count(x) 返回列表中元素的個數
L.remove(x) 從列表中刪除第一次出現在列表中的值
l=[1,3,4,5,7,3,8,9]
l.remove(3) #l=[1,4,5,7,3,8,9]
L.copy() 複製此列表(只複製一層,不會複製深層物件)
l=[1,3,4,5,7,3,8,9]
l[2]=[1]
l2=l
# 非複製,為賦值
l2=l.copy()
# 複製
L.append(x) 向列表中追加單個元素
l=[1,3,4,5,7,3,8,9]
l.append(9)
# l=[1,3,4,5,7,3,8,9,9]
l.append([8,9,9])
# l=[1,3,4,5,7,3,8,9,[8,9,9]]
L.extend(list) 向列表追加另一個列表
l=[1,3,4,5,7,3,8,9]
l.extend([8,9,9])
# l=[1,3,4,5,7,3,8,9,8,9,9]
等同於l += []
L.clear() 清空列表,等同於 L[:] = []
l=[1,3,4,5,7,3,8,9]
l.clear()
#l=[]
L.sort(reverse=False) 將列表中的元素進行排序,預設順序按值的小到大的順序排列
l=[1,3,4,5,7,3,8,9]
L.sort(reverse=False)
l=[1,3,3,4,5,7,8,9]
#False為升序,True為降序
L.reverse() 列表的反轉,用來改變原列表的先後順序
l=[1,3,4,5,7,3,8,9]
L.reverse()
#l=[9,8,3,7,5,4,3,1]
L.pop([index]) 刪除索引對應的元素,如果不加索引,預設刪除最後元素,同時返回刪除元素的引用關係
l=[1,3,4,5,7,3,8,9]
m=l.pop(2) #不等同於 del
#l=[1,3,5,7,3,8,9]
m=4'
練習三:
寫一個程式,讓使用者輸入很多個正整數,當輸入小於0的數時結束輸入
1)列印這些數中最大的數
2)列印這些數中第二大的數
3)刪除最小的一個數
4)按原來順序打印出剩餘的這些數
深拷貝和淺拷貝
淺拷貝: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]]>>>>l1不變
print(l2) #[1, 2, [3.14, 3.2]]'
列表和字串比較:
1.都是序列,有先後順序關係,有相同的運算操作
2.列表是可變的,字串是不可變的
3.列表可以存任意型別的資料,字串只能存字元
字串的文字解析方法:
S.split(sep=None)將字串,使用sep作用分割符分割S字串,返回分割後的字串列表,當不給定引數時,使用空白字元作為分隔符分割
S.join(interable)用可迭代物件中的字串,返回中間用S進行分割的字串
示例:
s = 'Beijing is capital'
l = s.split(" ")
# ["Beijing", "is", "capital"]
s = 'Beijing#is#capital'
l = s.split("#")
# ["Beijing"#"is"#"capital"]
常用空白字元
\t \n \r \x
l=['aaa','bbbb','ccccc']
'$'.join(l)
#生成 'aaa$bbbb$ccccc'
練習四:
有字串'hello'請生成'h e l l o'字串和'h-e-l-l-o'
l = list('hello')
l=' '.join(l) #' '.join("hello") #'h e l l o'
l='_'.join(l) #'h-e-l-l-o'
列表推導式 list comprehension
列表推導式是用可迭代物件建立列表的表示式
作用:
用簡單方法生成列表
語法:
[表示式 for 變數 in 可迭代物件]
#先執行可迭代物件,然後執行變數,最後執行表示式
或
[表示式 for 變數 in 可迭代物件 if 真值表達式]
#先執行可迭代物件,然後執行變數,之後執行if真值表達式,最後執行表示式
示例:
#生成一個數值1~9的平方的列表
#[1,4,9,16,....81]
#不用推導式:
l = []
for i in range(1,10):
l.append(i**2)
#推導式實現:
l = [i**2 for i in range(1,10)]
練習五:
1. 用列表推導式生成1~100以內奇數的列表
結果是:[1,3,5,7,...99]
l=[i for i in range(1,100,2)]
等同於
l=[i for i in range(1,100) if i %2 == 1]
2.輸入一個開始的整數用begin繫結
輸入一個結束的整數用end繫結
將從begin開始,到end結束(不包含end)的所有偶數存於列表中,並列印此表
(可以使用推到列表式完成,也可以用迴圈語句來完成)
列表推導式的巢狀
語法:
[表示式
for 變數1 in 可迭代物件1 if 真值表達式1
2 1 3
for 變數2 in 可迭代物件2 if 真值表達式2... ]
5 4 6
示例:
#將列表[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']
已知有一個字串:
s = '100,200,300,500,800'
將其轉化為列表,列表的內部是整數
L = [100,200,300,500,800]
課後練習:
1.有一些數存於列表中,如:
L = [1,3,2,1,6,4,2,....98,82]
1)將列表L中出現的數字存於另一個列表L2中
要求:
重複出現多次的數字只在L2列表中保留一份
2)將列表中出現兩次的數字存於L3列表中(在L3列表中保留一份)
2.計算出100以內的素數,將這些素數存於列表中,最後打印出列表中的這些素數
3.生成40個斐波那契數(Fibonacci)
1 1 2 3 5 8 13 21 ......
要求將這數整數存於列表L中,最後打印出這些數
(斐波那契的前兩個是1, 1, 之後的數是前兩個數的和)