其實,寫這個是爲了督促自己看書……然後 ……其實沒有然後了,人一鬆懈下來,就……ε=(´ο`*)))唉
第四章 列表
①列表數據類型
……
列表是數據類型!!!
……
……
沒啥好說的了,要不是看書,還以爲和數組一樣,現在看完全不一樣啊,絕望.jpg
“列表”是一個值,它包括多個字構成的序列,術語“列表值”指的是列表本身(它作爲一個值,可以保存在變量中,或傳遞給函數,像所有其他值一樣),而不是指列表值之內的那些值。列表看起來像這樣:['cat', 'bat', 'rat', 'elephant']。就像字符串值用引號來標記字符串起止一樣,列表用左方括號(代表)開始,右方括號(代表)結束。列表中的值稱爲“表項”,用逗號隔開。
——摘自書59頁(那兩個代表是我爲了語意連貫自己加的)
在交互環境中大家可以嘗試輸入
[1,2,3],輸出:[1,2,3]。
['cat', 'bat', 'rat', 'elephant'],輸出:['cat', 'bat', 'rat', 'elephant']
②用下標獲取列表中的單個值
就是這裏讓我聯想到數組的……同樣,還是直接先舉栗子吧ヾ(◍°∇°◍)ノ゙
spam=['cat','bat','rat','elephant']
print(spam[0])
print(spam[1])
print(spam[2])
print(spam[3])
print(spam[-1])
print(spam[-3])
print(spam[4])
輸出:
bat
rat
elephant
elephant
bat
Traceback (most recent call last):
File "/usercode/file.py", line 8, in <module>
print(spam[4])
IndexError: list index out of range
從輸出信息就可以看出,列表中的第一個表項(請允許我在後面稱之爲元素)對應的序號(請允許我強行取名)是0,也就是說,這個列表中有4個元素,但是元素的序號不是1、2、3、4而是0、1、2、3,而,一旦要訪問第5個元素(實際上不存在),輸入4的時候,會報錯。這與C++中的數組也有相似之處。那麼,如果是負數序號怎麼辦呢?那就從序號0的位置返回序號3的位置然後逆時針向後,也就是按3、2、1的順序依次試-1、-2、-3.。
如上圖所示(圖畫的不好,大家不要見怪)。
那麼,如果是序號爲4,也就是第5個元素呢?--》IndexError: list index out of range===》也就是超限
除了刻板的輸出,當然,還有一些其他的操作,比如:
spam=['cat','bat','rat','elephant']
print('hello '+spam[0])
輸出:hello cat
另外再補充一點,序號不能是浮點數,比如:
spam=['cat','bat','rat','elephant']
print(spam[1.0])
報錯信息:
Traceback (most recent call last):
File "/usercode/file.py", line 2, in <module>
print(spam[1.0])
TypeError: list indices must be integers, not float
列表也可以包含其他列表值。這些列表的列表中的值,可以通過多重下標來訪問:
spam=[['cat','bat','rat','elephant'],[10,20,30,40,50]]
print(spam[0][1])
print(spam[1][4])
輸出:
bat
50
第一個下標表示使用哪個值,第二個下標表明該列表中哪一個值。
③利用切片獲取子列表
spam[2]是一個列表和下標。
spam[1:4]是一個列表和切片。
在一個切片中,第一個整數是切片開始處的下標。第二個整數是切片結束處的下標。
spam=['cat','bat','rat','elephant']
print(spam[0:2])#output:['cat', 'bat']
print(spam[-2:2])#output:[]
print(spam[-1:0])#output:[]
print(spam[0:0])#output:[]
print(spam[0:4])#output:['cat', 'bat', 'rat', 'elephant']
print(spam[0:5])#output:['cat', 'bat', 'rat', 'elephant']
④用len()獲取列表長度
spam=['cat','bat','rat','elephant']
print(len(spam))#output:4
⑤列表的增刪改查
1、增——用append()和insert()方法在列表中添加值&&列表連接與鏈表複製
spam=['cat','bat']
spam.insert(2,'rat')
spam.append('elephant')
print(spam)#output:['cat', 'bat', 'rat', 'elephant']
append()就是在列表的末尾添加元素(參數),而insert()可以控制插入的位置,比如,上面的(位置,參數),這個位置就是插入後該參數是第幾個元素,也就是插入後該參數後面元素的下標。
spam=['cat','bat']+['rat', 'elephant']
print(spam)#output:['cat', 'bat', 'rat', 'elephant']
bacon=['cat','bat']+[1,2]
print(bacon)#output:['cat', 'bat', 1, 2]
↑列表連接↓列表複製
spam=['cat','bat']*3
print(spam)#output:['cat', 'bat', 'cat', 'bat', 'cat', 'bat']
2、刪——用del語句&&用remove()方法
spam=['cat','bat','rat','elephant']
del spam[2]
print(spam)#output:['cat', 'bat', 'elephant']
spam=['cat','bat','rat','elephant']
spam.remove('elephant')
print(spam)#output:['cat', 'bat', 'rat']
3、改——用下標改變列表中的值&&sort()排序
spam=['cat','bat','raccoon','elephant']
spam[2]='rat'
print(spam)#output:['cat', 'bat', 'rat', 'elephant']
spam=['cat','bat','raccoon','elephant']
spam.sort()
print(spam)#output:['bat', 'cat', 'elephant', 'raccoon']
bacon=[61,1,4,3,2,45,-2]
bacon.sort()
print(bacon)#output:[-2, 1, 2, 3, 4, 45, 61]
sort()↑升序排列4、查——in和not in操作符&&用index()方法
spam=['cat','bat','raccoon','elephant']
print('raccoon' in spam)#output:True
print('raccoon' not in spam)#output:False
print('rat' in spam)#output:False
spam=['cat','bat','raccoon','elephant']
print(spam.index('raccoon'))
print(spam.index('rat'))
輸出:
2
Traceback (most recent call last):
File "/usercode/file.py", line 3, in <module>
print(spam.index('rat'))#output:False
ValueError: 'rat' is not in list
如果所查找的值在列表中,就返回該值的下標,如果不在,Python就報ValueError
⑥使用列表
書裏的例子是用來儲存貓的名字(WA的一聲哭了出來,也想養一隻貓啊)
先是暴力版本:
print('Enter the name of cat 1:')
catName1=input()
print('Enter the name of cat 2:')
catName2=input()
print('Enter the name of cat 3:')
catName3=input()
print('Enter the name of cat 4:')
catName4=input()
print('Enter the name of cat 5:')
catName5=input()
print('Enter the name of cat 6:')
catName6=input()
print('The cat names are:')
print(catName1+' '+catName2+' '+catName3+' '+catName4+' '+catName5+' '+catName6)
這個……怎麼說呢,乍一看沒有毛病,但是真的好麻煩
然後就出現了升級改進版:
catNames=[]
while True:
print('Enter the name of cat '+str(len(catName)+1)+'Or anter nothing to stop.):')
name=input()
if name=='':
break
catNames=catNames+[name]
print('The cat names are:')
for name in catNames:
print(' '+name)
str(len(catName)+1)
這一句是計算列表中元素的個數,然後+1,再將整型轉換爲字符串(不然沒法連接)
另外:
for i in range(4):
↑↓效果相同
for i in [0,1,2,3]:
⑦賦值——多重賦值&&增強的賦值操作
cat=['fat', 'black', 'loud']
size=cat[0]
color=cat[1]
disposition=cat[2]
可以直接寫作
cat=['fat', 'black', 'loud']
size,color,disposition=cat
#但是變量的個數必須與列表的長度嚴格一致,否則↓
cat=['fat', 'black', 'loud']
size,color,disposition,name=cat
報錯信息如下:
Traceback (most recent call last):
File "/usercode/file.py", line 3, in <module>
size,color,disposition,name=cat
ValueError: need more than 3 values to unpack
增強的賦值操作
增強的賦值語句 | 等價的賦值語句 |
spam+=1 | spam=spam+1 |
spam-=1 | spam=spam-1 |
spam*=1 | spam=spam*1 |
spam/=1 | spam=spam/1 |
spam%=1 | spam=spam%1 |
然後,我們可以這樣:
cat=['fat', 'black', 'loud']
cat*=3
print(cat)
#output:['fat', 'black', 'loud', 'fat', 'black', 'loud', 'fat', 'black', 'loud']
⑧類似列表的類型:字符串和元組
列表並不是唯一表示序列值的數據類型。比如,字符串與列表實際上很相似。也可以用於列表類似的方法操作字符串:
name='Zophie'
print(name[0])
print(name[-2])
print(name[0:4])
print('Zo' in name)
for i in name:
print(' * * * '+i+' * * * ')
輸出:
Z
i
Zoph
True
* * * Z * * *
* * * o * * *
* * * p * * *
* * * h * * *
* * * i * * *
* * * e * * *
而元組除了兩個方面,與列表幾乎完全一樣。
兩方面:
1、元組輸入用的是圓括號,而非方括號
eggs=('Hello',42,0.5)
print (eggs[0])
print (eggs[1:3])
print (len(eggs))
輸出:
Hello
(42, 0.5)
3
2、但是元組與字符串一樣,與列表不同的是,他們都是不可變的,不能改變他們的值。
比如:
eggs=('Hello',42,0.5)
eggs[1]=99
報錯信息:Traceback (most recent call last):
File "/usercode/file.py", line 2, in <module>
eggs[1]=99
TypeError: 'tuple' object does not support item assignment
好了,現在,講到了一個關鍵問題
—— ——可變和不可變數據類型
安利別人寫的博客(ε=(´ο`*)))唉我什麼時候才能寫這麼好的博客)
⑨用list()和tuple()函數來轉換類型
>>>tuple(['cat', 'dog', 5])
('cat', 'dog', 5)
>>>list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>>list('hello')
['h', 'e', 'l', 'l', 'o']
⑩引用
與C++中類似,相當於起一個別名。
一旦更改任何一個的內容,列表與列表的引用都會改變。
就像無論別人是直接叫我們的外號還是直接叫我們的名字我們都知道是是在叫我們
然後列表的引用直接是:列表的引用的名字=列表的名字,這樣就可以了
舉例:
spam=['A','B','C','D']
cheese=spam
cheese[1]=42
print(spam)
print(cheese)
輸出:
['A', 42, 'C', 'D']
['A', 42, 'C', 'D']
⑪copy模塊的copy()和deepcopy()函數
import copy
spam=['A','B','C','D']
cheese=copy.copy(spam)
cheese[1]=42
print(spam)
print(cheese)
輸出:
['A', 'B', 'C', 'D']
['A', 42, 'C', 'D']
copy()函數,相當於建立了一個新的鏈表,能獨立於第一個鏈表修改
如果要複製的鏈表中包含了鏈表,那麼使用deepcopy()函數可以用來同時複製內部的鏈表。
'''
好啦,就先到這裏啦ヾ(◍°∇°◍)ノ゙
'''