MOOC python筆記(三) 序列容器:字串、列表、元組
容器概念
容器是Python中的重要概念,分為有序與無序。
有序容器也稱為序列型別容器,如:字串、列表。
通用序列容器操作
容器連線+
加號可以把兩個序列連線成一個更大的容器,相加後兩個序列的值並不改變
>>> s1='abc' >>> s2='def' >>> s3=s1+s2 >>> s3 'abcdef' >>> s1 'abc' >>> s2 'def' >>> l1=[1,2,3] >>> l2=[4,5,6] >>> l3=l1+l2 >>> l3 [1, 2, 3, 4, 5, 6] >>> l1 [1, 2, 3] >>> l2 [4, 5, 6]
數乘
一個序列容器乘以一個整數,把序列重複整數遍。相乘後原序列依然不發生變化。
>>> s1='ab'
>>> s2=s1*3
>>> s2
'ababab'
>>> l1=[1,2]
>>> l2=l1*3
>>> l2
[1, 2, 1, 2, 1, 2]
in與not in
in判斷一個元素是否在序列容器中,not in判斷是否不再序列容器中,返回值為布林型別。
>>> s1='abc' >>> 'a'in s1 True >>> 'ab'in s1 True >>> 'd' in s1 False >>> l1=[1,2,3] >>> 1 in l1 True >>> [1,2] in l1#錯誤因為[1,2]不在[1,2]中 False` >>> [1,2] in [[1,2],3]#正確 True
索引[]
取單個元素,從0開始計數。
我們一個稱第一個元素為第一個,第零號。
最大下標為長度減一,超過此範圍會報錯。
我們也可以倒著數,最後一個元素為-1,第一個元素為長度的負數。
列表的索引支援重新賦值,字串不支援
>>> l=[1,2,3] >>> l[1]=3 >>> l [1, 3, 3] >>> s="abc" >>> s[1]="c" Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> s[1]="c" TypeError: 'str' object does not support item assignment
切片[]
在一個序列容器l中,有l[a:b]其中a<b,(若a>b,l[a:b]為空串)
l[a:b]=l[a]+l[a+1]+......+l[b-1]。(若a=0,a可以省略)
在切片中依然可以只用負數索引,並且有時可以做到一些直接索引不好做的操作。
如,我們要把一個數字+一個字元的串中的最後一個字元去掉,直接使用切片似乎不太好處理,因為我們無法確定數字的長度。
這時我們可以使用[0:-1],我們切刀的第一個元素到倒數第二個元素。巧妙地解決了這個問題。
>>> s="25c"
>>> s[:-1]
'25'
(注意,如果序列容器中,我們可以在切片中使用長度(這似乎看上去並不合理),這是為了解決無法切片得到最後一個元素的問題,但我們通常不推薦這麼做,我們通常使用省略最後一個切片範圍的方法來使得切片取到最後一個字元)
通用序列容器函式
len函式
獲得序列容器的長度。
min函式
獲得序列容器中最小的元素。
max函式
獲得序列容器中的最大元素。
sort函式
排序函式,按照ASC碼順序排序。
字串特性
字串中的引號與轉義
如果需要在字串中使用單引號,我們可以使用雙引號包裹。
如果需要在字串中使用雙引號,我們可以使用單引號包裹。
>>> a="'a'+'b'"
>>> a
"'a'+'b'"
>>> a='"a"+"b"'
>>> a
'"a"+"b"'
也可以使用反斜槓(左上到右下)做轉義。
>>> a="\'a\'+\'b\'"
>>> a
"'a'+'b'"
三個單引號或者三個雙引號,可以使字串保留回車。
>>> """
a
cacad
casdw
,
"""
'\na\ncacad\ncasdw\n,\n'
如果想在輸出時在多行書寫,但同時最後的結果不會換行,可以在行末加反斜槓。
>>> s="adad\
vasd\
avasddaw\
,\
"
>>> print(s)
adadvasdavasddaw,
如果想使輸入時的字元,不被識別成轉義字元,我們可以在引號前面加一個r。
>>> s=r'a\ndjwaid\tdad'
>>> s
'a\\ndjwaid\\tdad'
>>> print(s)
a\ndjwaid\tdad
字串特有函式(方法)
lower和upper
把大寫變成小寫,不會改變原來字串
>>> s="ADADWDADS"
>>> s.lower()
'adadwdads'
>>> s
'ADADWDADS'
upper是把小寫變成大寫,使用方法與lower一致。
find
find("s",a,b)從左往右數第一次在字串的[a,b-1]範圍中出現的位置。
如果找不到則返回-1
>>> s.find("p",0,2)
-1
>>> s.find("p",0,3)
2
count
count('s')計算s在字串中出現的次數。
>>> s="hello,world"
>>> s.count('l')
3
strip、lstrip、rstrip
strip去掉左右兩邊空格,lstrip去掉左邊空格,rstrip去掉右邊空格。
>>> s=' hello world '
>>> s.strip()
'hello world'
>>> s.lstrip()
'hello world '
>>> s.rstrip()
' hello world'
replace
replace('s1','s2')把字串中的's1'替換成's2'
>>> s=' hello world '
>>> s.replace(' ','-')
'-hello-world-'
%
字串的格式化,類似於C/C++中,不同的是後面也要用%,如print("%d+%f"%(1,1.2))
,這裡略。
列表特性
列表的字面是可以是表示式
>>> a=6
>>> b=8
>>> [a,b]
[6, 8]
>>> [a+2,b-a]
[8, 2]
list函式可以將其他型別轉換成列表
>>> s="this is a string"
>>> list(s)
['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g']
如果列表的元素還是一個列表,就形成了廣義表
>>> t=[[1,2,3],[4,5,6],[7,8,9]]
>>> len(t)
3
>>> t[0]
[1, 2, 3]
>>> t[0][0]
1
列表的賦值並不重分配空間
列表的賦值並不重分配空間,只是把新變數的指標也指向原來的變數指向的地址。這導致了,改變被賦值的變數會導致原變數被修改,這與其他變數的賦值不同。
>>> t=[1,2,3]
>>> t[0]
1
>>> l=t
>>> l[0]
1
>>> l[0]=2
>>> l
[2, 2, 3]
>>> t
[2, 2, 3]
如圖:
列表切片的其他應用
為了解決上面的問題,我們可以使用切片
如果想要重新分配一個空間來讓新變數擁有可以使用切片的方法。
>>> t1=[1,2,3]
>>> t2=t1[:]#省略開頭結尾,表示從0開始一直到結束
>>> t2[0]=0
>>> t1
[1, 2, 3]
>>> t2
[0, 2, 3]
如圖:
使用切片時,如果切片在賦值號右邊,那麼它會給左邊的變數分配新的空間,
如果在左邊,那麼它指向的是原來的空間,所以可以通過改變切片的值來改變原來的空間。
>>> t=[1,2,3,4,5,6,7,8,9,10]
>>> ts=t[2:4]
>>> t[2:4]=[10,20]
>>> ts
[3, 4]
>>> t
[1, 2, 10, 20, 5, 6, 7, 8, 9, 10]
如圖:
甚至可以賦與切片中元素個數不同的列表。
>>> t[2:4]=[10,20,30]
>>> t
[1, 2, 10, 20, 30, 5, 6, 7, 8, 9, 10]
我們也可以利用這一特性來刪除元素
python >>> t[2:4]=[]#刪除第二個第三個元素。 >>> t [1, 2, 30, 5, 6, 7, 8, 9, 10]
python
del運算子
在del後面加上要刪除的元素,即可在列表中刪除這一元素。
如果要刪除整個列表,可以直接del+列表名即可。
>>> t=[1,2,3,4,5,6]
>>> del t[2]
>>> t
[1, 2, 4, 5, 6]
>>> del t
>>> t
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
t
NameError: name 't' is not defined
列表的函式
append
相當於C++中STL的push_back,把一個新的元素新增的列表的最後。
extend
相當容器連線運算子+,把兩個列表連線起來。
(注意:append與extend看似內容相似,實際上功能上還是有著很大的差異,append是新增元素,它的引數應該為一個字面量或者表示式,而extend的作用是擴充套件列表,連線兩個列表,後面的引數必須也是一個列表)
>>> t=[1,2,3,4,5,6,7,8]
>>> t.append(10)
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10]
>>> t.extend([1,2,3])
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3]
>>> t.append([1,2,3])#這是正確的因為列表也是一個字面量
>>> t
[1, 2, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, [1, 2, 3]]
>>> t.extend(1)#下面報錯,因為引數不為列表
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
t.extend(1)
TypeError: 'int' object is not iterable
insert函式
insert函式有兩個引數,第一個引數指定在哪個元素前面插入(0~INF),第二個元素指定要插入的元素(字面量或者表示式)
>>> t=[1,2,3,4,5,6,7]
>>> t.insert(0,0)
>>> t
[0, 1, 2, 3, 4, 5, 6, 7]
>>> t.insert(0,[1,2])
>>> t
[[1, 2], 0, 1, 2, 3, 4, 5, 6, 7]
當insert的第一個引數超過了列表的最大下標時,我們會把元素新增到列表尾部。
>>> t=[1,2,3,4,5,6]
>>> t.insert(100,1)
>>> t
[1, 2, 3, 4, 5, 6, 1]
remove函式
刪除元素,與del運算子不同的是,del是刪除指定位置的元素,remove是刪除指定值(第一個)的元素。
如果有很多指定值,那麼刪除第一個。
>>> t=[1,2,3,4,5,6,2]
>>> t.remove(2)
>>> t
[1, 3, 4, 5, 6, 2]
pop函式
與資料結構中堆疊的pop一致,即彈出最後一個元素,函式的返回值為該元素的值。
如果該函式帶有引數,那麼彈出的值為該位置元素的值。
>>> t=[1,2,3,4,5,6,7,8]
>>> t.pop()
8
>>> t.pop(2)
3
>>> t
[1, 2, 4, 5, 6, 7]
reverse函式
翻轉列表,沒有什麼好說的。
>>> t=[1,2,3]
>>> t.reverse()
>>> t
[3, 2, 1]
index函式
與字串的find函式一致,返回指定元素在列表中的位置,如果有多個就返回第一個。
與find函式基本一致
>>> t=[1,3,4,5,7,3,4,24]
>>> t.index(4,3,9)
6
>>> t.index(4)
2
>>> t.index(4,3)
6
列表與字串的轉換
split函式
預設無參時把字串按空格分隔成列表。
>>> s="this is a string"
>>> s.split()
['this', 'is', 'a', 'string']
帶引數時按照引數分隔。
>>> s="12:35"
>>> s.split(":")
['12', '35']
join函式
把一個列表按照某個字串來作為連線,格式為s.join(l),其中s為連線的字串,l為列表。
>>> l=["hello","world"]
>>> "-".join(l)
'hello-world'
元組
與列表基本一樣,但是元組是用圓括號'('包裹的。並且元組中的元素不能被改變(可以看出C/C++中的const string)!
元組與字串一致都不支援元素的重新賦值。
元組可以使用除了修改元素的所有的列表的函式。
一般不加括號的容器預設為元組。
>>> a,b=3,4
>>> a
3
>>> b
4
>>> p=3,4
>>> p
(3, 4)
tuple函式
可以用tuple函式把其他容器轉化為元組。
隨機庫random
使用隨機函式前需要import random
。
shuffle函式
random.shuffle(t)
把容器t隨機打亂。
>>> import random
>>> t=["zyk","zjc","ysy","xhm"]
>>> random.shuffle(t)
>>> t
['ysy', 'xhm', 'zyk', 'zjc']
>>> random.shuffle(t)
>>> t
['xhm', 'zjc', 'zyk', 'ysy']
其他函式詳見:python--隨機函式(random,uniform,randint,randrange,shuffle,sample)
隨機數種子
seed(int a),每個種子獲得的隨機數是相同的,可以藉此來完成一些特殊的任務