第四章:列表(List[ ])
- 定義:一組有順序的集合(重點:有順序)
1 創建列表的方法(4種)
#創建空列表
l1 = []
print(type(l1))
print(l1)
#創建單值列表
l2 = [1001]
print(type(l2))
print(l2)
#創建多值列表
l3 = [1,2,3,4,5,6]
print(type(l3))
print(l3)
#使用list
l4 = list()
print(type(l4))
print(l4)
2 列表常用操作
- 列表的下標都是從0開始(基本上所有的語言下標都是從0開始)
- 注意:左閉右開
2.1 創建列表
l = [1,3,5,7,8,0]
print(l[3])
#結果:7
print(l[1:4])
#結果:[3,5,7] 注:Python中一般情況下都是左閉右開
print(l[2:10])
#結果:[5,7,8,0] 注:超過區間範圍的忽略不計
print(l[1:])
#結果:[3,5,7,8,0]
print(l[:4])
#結果:[1,3,5,7]
2.2 列表刪除
l = [1,2,3,4,5,6]
del l[3]
print(l)
del l
print(l)
結果:[1,2,3,5,6]
然後報錯
注:刪除列表中的某個成員只是原地刪除,並不是生成一個新的列表,因此其地址不會改變
刪除了某個變量之後,不能再使用該變量,否則會報錯
2.3 列表加法
- 兩個列表相加,即將兩個列表合成一個
a = [1,2,3,4,5]
b = [5,6,7,8,9]
c = a + b
print(c)
結果:[1,2,3,4,5,5,6,7,8,9]
2.4 列表乘法
- 列表乘n,即將列表重複n遍
a = [1,2,3]
b = a * 3
print(a)
結果:[1,2,3,1,2,3,1,2,3]
2.5 列表遍歷
- for,while,一般情況下不使用while遍歷列表
- 使用for遍歷
a = [1,2,3,4,5]
for i in a:
print(i)
b = ["aaa","bbb","ccc"]
for i in b:
print(i)
結果:
1
2
3
4
5
aaa
bbb
ccc
- 使用while遍歷
a = [1,2,3,4,5]
b = len(a)
index = 0
while index < b:
print(a[index])
index += 1
可以看出,使用while遍歷列表比較麻煩,代碼冗長,因此一般情況下不使用while遍歷列表
- 雙層列表遍歷
a = [["damao",11],["cccd",22],["adss",33]]
for k,v in a:
print(k,"-->",v)
a = [["damao",11,"ddsa"],["cccd",22,"qwe"],["adss",33,"dfffa"]]
for k,v,z in a :
print(k,"-->",v,"-->",z)
結果:
damao --> 11
cccd --> 22
adss --> 33
damao --> 11 --> ddsa
cccd --> 22 --> qwe
adss --> 33 --> dfffa
2.6 列表內涵
- 通過簡單的方法創作list
- 下列代碼的含義:將a中的元素逐個放入b中
a = [1,2,3,4,5]
b = [i for i in a]
print(b)
a = [1,2,3,4,5]
b = [i*10 for i in a]
print(b)
結果:[1, 2, 3, 4, 5]
[10, 20, 30, 40, 50]
- 可以加入條件語句,如要求爲偶數,爲100的倍數等
a = range(1,50)
b = [i for i in a if i % 2 ==0]
print(b)
c = range(100,1000)
d = [i for i in c if i % 100 ==0]
print(d)
- 可以使用for循環嵌套
a = [i for i in range(1,5)]
b = [i for i in range(100,500) if i % 100 == 0]
c = [m+n for m in a for n in b]
print(c)
c = [m+n for m in a for n in b if m+n < 350]
print(c)
結果:
[101, 201, 301, 401, 102, 202, 302, 402, 103, 203, 303, 403, 104, 204, 304, 404]
[101, 201, 301, 401, 102, 202, 302, 402, 103, 203, 303, 403, 104, 204, 304, 404]
[101, 201, 301, 102, 202, 302, 103, 203, 303, 104, 204, 304]
2.7 列表常用函數
2.7.1 list—將其他格式的數據轉換成list
s = "I love wangxiaojing"
print(list(s))
結果:
['I', ' ', 'l', 'o', 'v', 'e', ' ', 'w', 'a', 'n', 'g', 'x', 'i', 'a', 'o', 'j', 'i', 'n', 'g']
- 空格也是字符
2.7.2 length,max,min
l = [1,2,3,4,555]
print(len(l),max(l),min(l))
結果:
5 555 1
2.7.2 追加以及插入—append,insert
- 追加—append,即爲在列表末尾追加一個值,原地操作
- 插入—insert(index,data),即爲在index之前插入data,原地操作
l = [i for i in range(1,6)]
print(id(l))
l.append(888)
print(l,id(l))
l.insert(4,666)
print(l,id(l))
結果:
139678380997960
[1, 2, 3, 4, 5, 888] 139678380997960
[1, 2, 3, 4, 666, 5, 888] 139678380997960
2.7.3 pop、remove
- pop,將隊尾某個值拿出來賦值給某個值,並在當前隊列刪除這個值(一般使用該函數時,經常會看到賦值操作)
- 刪除列表中某個特定的值 remove,該操作是原地刪除
a = [i for i in range(1,8)]
print(id(a))
last_word = a.pop()
print(last_word)
print(a,id(a))
a.insert(5,666)
print(a,id(a))
a.remove(666)
print(a,id(a))
結果:
139678380968648
7
[1, 2, 3, 4, 5, 6] 139678380968648
[1, 2, 3, 4, 5, 666, 6] 139678380968648
[1, 2, 3, 4, 5, 6] 139678380968648
2.7.4 reverse、clear
- reverse,翻轉列表,原地操作
- clear,清空列表,原地操作
a = [i for i in range(1,8)]
print(a,id(a))
a.reverse()
print(a,id(a))
a.clear()
print(a,id(a))
結果:
[1, 2, 3, 4, 5, 6, 7] 139678380995528
[7, 6, 5, 4, 3, 2, 1] 139678380995528
[] 139678380995528
2.7.5 extend、count
- extend,,在某個列表後面擴展一個列表,其操作和列表的加法類似,不同點在於extend操作是原地操作,而列表相加會另外開闢一塊存儲 空間來存放新變量的值和地址
- count,統計列表中某個值的個數
a = [i for i in range(1,8)]
b = [i for i in range(6,12)]
print(a,id(a))
print(a + b,id(a+b))
a.extend(b)
print(a,id(a))
print(a.count(6))
結果:
[1, 2, 3, 4, 5, 6, 7] 139678399181704
[1, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11] 139678381585224
[1, 2, 3, 4, 5, 6, 7, 6, 7, 8, 9, 10, 11] 139678399181704
2
2.7.6 copy
- 此處copy函數爲淺拷貝,即只拷貝一層內容
- 深拷貝暫時不講?
#列表賦值操作
a = [i for i in range(1,8)]
print(a,id(a))
b = a
print(b,id(b))
b[4] = 777
print(b,id(b))
print(a,id(a))
結果:
[1, 2, 3, 4, 5, 6, 7] 139678380996680
[1, 2, 3, 4, 777, 6, 7] 139678380996680
[1, 2, 3, 4, 777, 6, 7] 139678380996680
- 在此處將列表a賦值給b後,輸入傳址操作,在改變b列表中某個變量的值後,列表a中的值也相應改變,然後並不是我想看到的結果,我 只是單純的想改變列表b中某個變量的值
- 因此,需要採用copy函數
a = [i for i in range(1,8)]
print(a,id(a))
b = a.copy()
print(b,id(b))
b[6] = 888
print(a,id(a))
print(b,id(b))
結果:
[1, 2, 3, 4, 5, 6, 7] 139678381486152
[1, 2, 3, 4, 5, 6, 7] 139678380996680
[1, 2, 3, 4, 5, 6, 7] 139678381486152
[1, 2, 3, 4, 5, 6, 888] 139678380996680
附:深拷貝皮毛
a = [1,2,3,[10,20,30]]
b = a.copy()
print(a,id(a))
print(b,id(b))
print(a,id(a[3][2]))
print(b,id(b[3][2]))
a[3][2] = 222
print(a)
print(b)
結果:
[1, 2, 3, [10, 20, 30]] 139678381047752
[1, 2, 3, [10, 20, 30]] 139678380825608
[1, 2, 3, [10, 20, 30]] 94184610553984
[1, 2, 3, [10, 20, 30]] 94184610553984
[1, 2, 3, [10, 20, 222]]
[1, 2, 3, [10, 20, 222]]
- 出現以上結果(a[3][2]和b[3][2]的地址一樣)的原因是由於copy是淺拷貝,即值拷貝一層內容,如果需要解決此問題需要用到深拷貝, 而深拷貝需要特定的工具,此處暫時不講(因爲老師不會,哈哈哈)
3 列表的分片操作
- 列表的分片操作產生的是一個新的列表,其內存地址和之前的內存地址不一樣
l = [1,3,5,7,9,11,13]
print(l[1:6:1]) #第三位數控制步長增長
結果:[3,5,7,9,11]
print(l[1:6:2])
結果:[3,7,11]
- 下標值可以爲負數,如果爲負數,表明順序從右往左,規定列表的最後一個數的下標爲-1
- 右邊的下標要比左邊小
l = [1,3,5,7,9,11,13]
print(l[-4:-1])
結果:[7,9,11]
- 如果非要右邊的數比左邊大,則步長必須爲負數
l = [1,3,5,7,9,11,13]
print(l[-1:-4:-1])
結果:[13,11,9] #注:不管怎樣,永遠都是左閉右開
- 分片操作產生的是一個新的列表,內存地址不一樣
l = [1,3,5,7,9,11]
ll = l[:]
lll = ll
print(id(l))
print(id(ll))
print(id(lll))
結果:l與ll的地址不相同,ll與lll的地址相同
4 傳值和傳址
- 區別
- 簡單的數值採用傳值,只改變變量的值,不會改變變量的地址,即在函數內部的操作不會影響到外部變量
- 負責的變量採用傳址,不僅會改變變量的值,而且會改變其地址,即在函數內部的操作也會影響到外部的變量
def func1(n):
n = 100
print(n,id(n))
def func2(n):
n[3] = 200
print(n,id(n))
a = 9
print(a,id(a))
func1(a)
print(a,id(a))
l = [1,2,3,4,5]
print(l,id(l))
func2(l)
print(l,id(l))
結果:
9 94184610553312
100 94184610556224
9 94184610553312
[1, 2, 3, 4, 5] 139678399193160
[1, 2, 3, 200, 5] 139678399193160
[1, 2, 3, 200, 5] 139678399193160
- 可以看出,函數func1僅僅只是將變量a的值傳過去,而函數func2將值和地址都傳過去了