Python 內置的四種經常使用數據結構:列表(list)、元組(tuple)、字典(dict)以及集合(set)。
這四種數據結構一但均可用於保存多個數據項,這對於編程而言是很是重要的,由於程序不只須要使用單個變量來保存數據,還須要使用多種數據結構來保存大量數據,而列表、元組、字典和集合就可知足保存大量數據的需求。
列表(list)和元組(tuple)比較類似,它們都按順序保存元素,每一個元素都有本身的索引,所以列表和元組均可經過索引訪問元素。兩者的區別在於元組是不可修改的,但列表是可修改的。
字典(dict)和集合(set)相似,它們存儲的數據都是無序的,其中字典是用 key-value
的形式保存數據python
所謂序列,指的是一塊可存放多個值的連續內存空間,這些值按必定順序排列,可經過每一個值所在位置的編號(稱爲索引)訪問它們。編程
不管是採用正索引值,仍是負索引值,均可以訪問序列中的任何元素。數組
注意,在使用負值做爲列序中各元素的索引值時,是從 -1 開始,而不是從 0 開始。
[root@kube list]# cat demo1.py str="Py序列化詳解" print(str[0],"---",str[-6]) print(str[5],"---",str[-1]) [root@kube list]# py demo1.py P --- y 詳 --- 解 [root@kube list]#
切片操做是訪問序列中元素的另外一種方法,它能夠訪問必定範圍內的元素,經過切片操做,能夠生成一個新的序列。
序列實現切片操做的語法格式以下:數據結構
sname[start : end : step]
其中,各個參數的含義分別是: sname:表示序列的名稱; start:表示切片的開始索引位置(包括該位置),此參數也能夠不指定,會默認爲 0,也就是從序列的開頭進行切片; end:表示切片的結束索引位置(不包括該位置),若是不指定,則默認爲序列的長度; step:表示在切片過程當中,隔幾個存儲位置(包含當前位置)取一次元素,也就是說,若是 step 的值大於 1,則在進行切片去序列元素時,會「跳躍式」的取元素。若是省略設置 step 的值,則最後一個冒號就能夠省略。
[root@kube list]# cat demo2.py str="py序列切片" print(str[:0]) #end 爲0 表示結束索引位置可是不包括該位置,所以爲空 print(str[:1]) print(str[:2]) print(str[1:2]) num="123456789" print(num[1:5:2]) #在1-5 的區間中隔兩位取一個值 [root@kube list]# py demo2.py p py y 24 [root@kube list]#
Python 中,支持兩種類型相同的序列使用「+」運算符作相加操做,它會將兩個序列進行鏈接,但不會去除重複的元素。app
裏所說的「類型相同」,指的是「+」運算符的兩側序列要麼都是序列類型,要麼都是元組類型,要麼都是字符串。
root@kube list]# cat demo3.py print("你好"+"我好"+"dajiahao") [root@kube list]# py demo3.py 你好我好dajiahao [root@kube list]#
Python 中,使用數字 n 乘以一個序列會生成新的序列,其內容爲原來序列被重複 n 次的結果函數
[root@kube list]# cat demo3.py str="你好"+"我好"+"dajiahao" print(str*3) [root@kube list]# py demo3.py 你好我好dajiahao你好我好dajiahao你好我好dajiahao [root@kube list]#
Python 中,可使用 in 關鍵字檢查某元素是否爲序列的成員,其語法格式爲:spa
value in sequence
和 in 關鍵字用法相同,但功能剛好相反的,還有 not in 關鍵字,它用法檢查某個元素是否不包含在指定的序列中.net
value not in sequence
[root@kube list]# cat demo4.py #coding:utf-8 str="test.com.cn" print('e' in str) print('e' not in str) [root@kube list]# py demo4.py True False [root@kube list]#
Python提供了幾個內置函數(表 3 所示),可用於實現與序列相關的一些經常使用操做code
函數 | 功能 |
---|---|
len() | 計算序列的長度,即返回序列中包含多少個元素。 |
max() | 找出序列中的最大元素。注意,對序列使用 sum() 函數時,作加和操做的必須都是數字,不能是字符或字符串,不然該函數將拋出異常,由於解釋器沒法斷定是要作鏈接操做(+ 運算符能夠鏈接兩個序列),仍是作加和操做。 |
min() | 找出序列中的最小元素。 |
list() | 將序列轉換爲列表。 |
str() | 將序列轉換爲字符串。 |
sum() | 計算元素和。 |
sorted() | 對元素進行排序。 |
reversed() | 反向序列中的元素。 |
enumerate() | 將序列組合爲一個索引序列,多用在 for 循環中。 |
[root@kube list]# cat demo5.py str="test.com.cn" print(max(str)) print(min(str)) print(len(str)) print(list(str)) [root@kube list]# py demo5.py t . 11 ['t', 'e', 's', 't', '.', 'c', 'o', 'm', '.', 'c', 'n'] [root@kube list]#
Python 中沒有數組,可是加入了更增強大的列表。若是把數組看作是一個集裝箱,那麼 Python 的列表就是一個工廠的倉庫。對象
從形式上看,列表會將全部元素都放在一對中括號 [] 中,相鄰元素之間用逗號分隔,格式中,element1~elementn 表示列表中的元素,個數沒有限制,只要是 Python 支持的數據類型就能夠。以下所示
[element1,element2,element3,...,elementn]
[root@kube list]# cat demo6.py lt=['c.test.com',1,[2,3],2.34,'aa'] print(lt) print(type(lt)) [root@kube list]# py demo6.py ['c.test.com', 1, [2, 3], 2.34, 'aa'] <class 'list'> [root@kube list]#
[root@kube list]# cat demo7.py lt=[1,'x.test.com',[2,3]] # = 號賦值使用 [] 括起來 str="1234test" print(type(lt)) print(type(str)) lt2=list(str) #使用 list() 函數轉換 print(lt2) print(type(lt2)) [root@kube list]# py demo7.py <class 'list'> <class 'str'> ['1', '2', '3', '4', 't', 'e', 's', 't'] <class 'list'> [root@kube list]#
[root@kube list]# cat demo8.py vol=[1,'test.com',[3,4,5],44,'fff','ee'] print(vol[:1]) print(vol[:2]) print(vol[2:4]) del vol print(vol) [root@kube list]# py demo8.py [1] [1, 'test.com'] [[3, 4, 5], 44] Traceback (most recent call last): File "demo8.py", line 6, in <module> print(vol) NameError: name 'vol' is not defined [root@kube list]#
append() 方法用於在列表的末尾追加元素,該方法的語法格式以下:
listname.append(obj)
固然,若是但願不將被追加的列表或元組當成一個總體,而是隻追加列表中的元素,則可以使用列表提供的 extend() 方法。extend()方法的語法格式以下:
listname.extend(obj)
若是但願在列表中間增長元素,則可以使用列表的 insert() 方法,此方法的語法格式爲:
listname.insert(index , obj)
其中,index 參數指的是將元素插入到列表中指定位置處的索引值。
使用 insert() 方法向列表中插入元素,和 append() 方法同樣,不管插入的對象是列表仍是元組,都只會將其總體視爲一個元素。
[root@kube list]# cat demo9.py a_list=['test.com.cn',2,[2,'a']] a_list.append('b') print(a_list) a_list.extend([9,8,7]) print(a_list) a_list.insert(4,'MM') print(a_list) [root@kube list]# py demo9.py ['test.com.cn', 2, [2, 'a'], 'b'] ['test.com.cn', 2, [2, 'a'], 'b', 9, 8, 7] ['test.com.cn', 2, [2, 'a'], 'b', 'MM', 9, 8, 7] [root@kube list]#
在列表中刪除元素,主要分爲如下 3 種應用場景:
[root@kube list]# cat demo10.py a_list=[1,2,"a.b.c",[4,5],(2,4)] print(a_list) del a_list[-2] print(a_list) a_list.remove(2) print(a_list) a_list.clear() print(a_list) [root@kube list]# py demo10.py [1, 2, 'a.b.c', [4, 5], (2, 4)] [1, 2, 'a.b.c', (2, 4)] [1, 'a.b.c', (2, 4)] [] [root@kube list]#
列表的元素至關於變量,所以程序能夠對列表的元素賦值,這樣便可修改列表的元素
slice 分片一樣可使用
[root@kube list]# cat demo11.py a_list=list(range(0,10)) #list() 函數轉換爲列表 print(a_list) a_list[2]='a' #替換序列爲2 的值 print(a_list) a_list[-1]='ffff' #替換序列爲-1 的值 print(a_list) a_list[3:4]=['s','d'] #替換分片3-4 的值 print(a_list) a_list[4:6]=[] #把 4-6 的值替換爲空 print(a_list) a_list[1:3]='test' #對列表使用 slice 語法賦值時,不能使用單個值;若是使用字符串賦值,Python 會自動把字符串當成序列處理,其中每一個字符都是一個元素。 print(a_list) a_list[2:6:2]=['MM','NN'] #在使用 slice 語法賦值時,也可指定 step 參數。但若是指定了 step 參數,則要求所賦值的列表元素個數與所替換的列表元素個數相等 print(a_list) [root@kube list]# py demo11.py [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 'a', 3, 4, 5, 6, 7, 8, 9] [0, 1, 'a', 3, 4, 5, 6, 7, 8, 'ffff'] [0, 1, 'a', 's', 'd', 4, 5, 6, 7, 8, 'ffff'] [0, 1, 'a', 's', 5, 6, 7, 8, 'ffff'] [0, 't', 'e', 's', 't', 's', 5, 6, 7, 8, 'ffff'] [0, 't', 'MM', 's', 'NN', 's', 5, 6, 7, 8, 'ffff'] [root@kube list]#
除前面的增長元素、刪除元素、修改元素方法以外,列表還包含了一些經常使用的方法。
count() 方法,此方法用於統計列表中某個元素出現的次數
listname.count(obj)
index() 方法用於定位某個元素在列表中出現的位置(也就是索引),若是該元素沒有出現,則會引起 ValueError 錯誤。此方法的基本語法格式爲
listname.index(obj,start,end)
同 count() 方法不一樣,index() 方法還可傳入 start、end 參數,用於在列表的指定範圍內搜索元素。
pop() 方法會移除列表中指定索引處的元素,若是不指定,默認會移除列表中最後一個元素。該方法的基本語法格式爲:
listname.pop(index)
reverse() 方法會將列表中全部元素反向存放。該方法的基本語法格式爲:
listname.reverse()
sort() 方法用於對列表元素進行排序,排序後原列表中的元素順序會方發生改變。sort() 方法的語法格式以下:
listname.sort(key=None, reserse=False)
listname.sort(key=None, reserse=False)
能夠看到,和其餘方法不一樣,此方法中多了 2 個參數,它們的做用分別是: key 參數用於指定從每一個元素中提取一個用於比較的鍵。例如,使用此方法時設置 key=str.lower 表示在排序時不區分字母大小寫。 reverse 參數用於設置是否須要反轉排序,默認 False 表示從小到大排序;若是將該參數設爲 True,將會改成從大到小排序。
下面代碼示範了使用列表做爲「棧」的示例:
stack = [] # 向棧中「入棧」3個元素 stack.append("fkit") stack.append("crazyit") stack.append("Charlie") print(stack) # ['fkit', 'crazyit', 'Charlie'] # 第一次出棧:最後入棧的元素被移出棧 print(stack.pop()) print(stack) # ['fkit', 'crazyit'] # 再次出棧 print(stack.pop()) print(stack) # ['fkit']
ython range() 函數可以輕鬆地生成一系列的數字。例如,能夠像以下這樣使用 range() 來打印一系列數字:
[root@kube list]# cat demo14.py #coding:utf-8 seq=[] for i in range(1,4): #求1-3 的乘積 vol=i**2 seq.append(vol) print(seq) print('----------------------------') print(type([1,2,3,4])) #range 的type 類型的轉化 print(type(range(1,5))) [root@kube list]# py demo14.py [1, 4, 9] ---------------------------- <class 'list'> <class 'range'> [root@kube list]#
隊列和棧是兩種數據結構,其內部都是按照固定順序來存放變量的,兩者的區別在於對數據的存取順序: 隊列是,先存入的數據最早取出,即「先進先出」。 棧是,最後存入的數據最早取出,即「後進先出」。
考慮到 list 類型數據自己的存放就是有順序的,並且內部元素又能夠是各不相同的類型,很是適合用於隊列和棧的實現。本節將演示如何使用 list 類型變量來實現隊列和棧。
python list 列表實現
使用 list 列表模擬隊列功能的實現方法是,定義一個 list 變量,存入數據時使用 insert() 方法,設置其第一個參數爲 0,即表示每次都從最前面插入數據;讀取數據時,使用 pop() 方法,即將隊列的最後一個元素彈出。
[root@kube list]# cat demo15.py #coding:utf-8 #定義一個空列表,當作隊列 queue = [] #向列表中插入元素 queue.insert(0,"one") queue.insert(0,"two") queue.insert(0,"three") print(queue) print('取第一個元素:',queue.pop()) #pop() 默認取隊列最後一位 print('取第二個元素:',queue.pop()) print('取第三個元素:',queue.pop()) [root@kube list]# py demo15.py ['three', 'two', 'one'] 取第一個元素: one 取第二個元素: two 取第三個元素: three [root@kube list]#
python 實現棧
使用 list 列表模擬棧功能的實現方法是,使用 append() 方法存入數據;使用 pop() 方法讀取數據。append() 方法向 list 中存入數據時,每次都在最後面添加數據,這和前面程序中的 insert() 方法正好相反。
[root@kube list]# cat demo16.py #coding:utf-8 #定義一個list 當棧 stack = [] stack.append('one') stack.append('two') stack.append('three') print(stack) print('取第一個元素:',stack.pop()) print('取第二個元素:',stack.pop()) print('取第三個元素:',stack.pop()) [root@kube list]# py demo16.py ['one', 'two', 'three'] 取第一個元素: three 取第二個元素: two 取第三個元素: one [root@kube list]#
collections模塊實現棧和隊列
queueAndStack = deque() queueAndStack.append(1) queueAndStack.append(2) queueAndStack.append("hello") print(list(queueAndStack)) #實現隊列功能,從隊列中取一個元素,根據先進先出原則,這裏應輸出 1 print(queueAndStack.popleft()) #實現棧功能,從棧裏取一個元素,根據後進先出原則,這裏應輸出 hello print(queueAndStack.pop()) #再次打印列表 print(list(queueAndStack))