1、序列
1.1 序列簡介
所謂序列,即元素的有序排列。序列中每個位置的元素都有其對應的唯一編號,也就是說我們可以通過元素的位置標識,去搜索到該元素。python中的內建序列有6種:列表、元祖、字符串、Unicode字符串、xrange對象、buffer對象,其中列表和元祖是最常見的序列,應重點掌握。字符串在上一篇文章中已簡單介紹,下面將以字符串為例,對序列的通用操作進行詳講。
1.2 序列通用操作
索引(indexing)
序列的索引即上文介紹的序列中元素的位置標識,按標識順序分為正向遞增序號(簡稱正序)和逆向遞減序號(簡稱逆序)。正序標識即由左往右,索引從0開始遞增,索引為0表示第一個元素,索引為1表示第二個元素,以此類推。以變量x='HELLO WORLD!'為例:
逆序標識即由右往左,索引從-1開始,索引為-1表示逆序第一個元素,索引為-2表示逆序第二個元素,以此類推。以字符串'HELLO WORLD!'為例:
根據字符串的索引,我們可以提取出對應位置上的元素,例如需要提取字符'R',可以使用正索引即'x[8]'去提取,也可以使用逆索引即'x[-4]'去提取。
x='HELLO WORLD!'#正序提取x[8]#逆序提取x[-4]
以上代碼執行結果為:
切片(sliceing)
使用索引提取序列元素不需要新創建變量,非常方便,但使用索引每次只能提取字符串中的單個字符,而實際運用中往往需要一次提取多個字符,這時便可以使用序列的另一特性:切片。切片是指通過序列的索引提取出指定範圍內的元素作為新的序列。
語法:obj [startindex:endindex:step]
obj:變量名
start_index:[可選參數],切片起始索引,默認為0(正序)或-1(逆序)
end_index:[可選參數],切片結束索引,默認為最後一個元素對應索引(正序),或第一個元素對應索引(逆序)
step:切片步長,默認為1
注意:序列中切片取值範圍為左閉右開,即包含起始索引,不包含結束位置。
x='HELLO WORLD!'
############ 提取字符'LLO'###########
x[2:5:1] #使用正索引
x[-10:-7:1] #使用負索引
x[2:5] #步長為1時可省略參數step
############ 提取字符'WRD'###########
x[6:11:2] #使用正索引,步長為2
x[-6:-1:2] #使用負索引,步長為2
############ 提取字符'LRO'###########
x[-3:-6:-1] #使用負索引,逆序提取
x[9:6:-1] #使用正索引,逆序提取
############ 正序提取所有字符 ##########
x[::] #三個參數皆可省略
############ 逆序提取所有字符 ##########
x[::-1] #步長為-1,不可省略
注意:正序提取時,起始索引應小於結束索引;逆序提取時,起始索引應大於結束索引,否則返回值為空序列 []。
相加(adding)
序列中類型相同的序列可以進行加法操作,即把兩個或多個序列拼接起來,注意不是數值上的加法運算(元素為數字型時容易混淆)。
x1='talk is cheap'x2=','x3='show me the code'print(x1+x2+x3)
以上代碼執行結果為:
相乘(multiplying)
類似於數學運算上的乘法運算,一個序列乘上一個正整數n,相當於將該字符串重複n次連接成一個新序列。
x='python 'print(x*3)
以上代碼執行結果為:
元素存在判斷
使用python的關鍵字「in」或「not in」,可以判斷指定元素是否存在該序列中或是否不存在該序列中,滿足條件則返回True ,不滿足條件則返回False 。
x='python ''t' in x'i' in x
以上代碼執行結果為:
序列相關BIF
len():返回序列所含元素的數量
max():返回元素中的最大值
min():返回元素中的最小值
x='python'len(x)max(x)min(x)
當序列中元素的類型是字符串型時,使用max()或min()將對字符串進行按位比較,即對字符串中各元素的ascii碼進行比較,輸出最大值或最小值。
2、列表
在對序列有了大體的認識後,現在開始介紹序列中最具代表性的數據類型——列表。
python中列表以中括號'[ ]'為標識,將一個或多個元素(以逗號分隔)括起來為一個列表,其元素可以為python中任意一種數據類型包括列表本身,且各元素不需要具備相同的數據類型。列表可以簡單理解為我們日常生活中超市每天的購物記錄,其中每個人的購物記錄為列表中的元素,每個人可以購買不同類型的物品,且購買數量往往不一致。
#創建列表x_listx_list=[2333,'python',['a','b','c']]print(x_list)
以上代碼執行的結果為:
除了上面1.2節介紹的序列通用操作外,列表還有其他一些比較常用的操作。
2.1 元素的更新
2.1.1 元素的修改
列表通過直接對元素的索引位置賦新值來修改元素。
語法:變量名[需修改元素的索引]=新值
#將變量x_list索引為0的元素修改為2222x_list[0]=2222print(x_list)
以上代碼執行結果為:
2.1.2 元素的刪除
列表通過對元素的索引位置,使用del語句來刪除列表的元素。
del 列表名[需刪除元素的列表]
#刪除變量x_list索引為1的元素del x_list[1]print(x_list)
以上代碼執行結果為:
2.2 常用方法
2.2.1 元素的增加
append():在列表最後添加一個新的元素語法:列表名.append(添加的元素)#在列表x_list最後添加元素'MySQL'x_list.append('MySQL')print(x_list)以上代碼執行結果為:注意:若添加的新元素為列表,append()會保存其列表形式添加到最後#在列表x_list最後添加元素['MySQL','SPSS']x_list=[2333,'python',['a','b','c']]x_list.append(['MySQL','SPSS'])print(x_list)以上代碼執行結果為:extend():在列表最後添加一個新列表內的多個元素語法:列表名.extend(添加的列表)與方法append()不同,extend()中添加的元素只能是列表類型,且不保存其列表形式,即將需要添加的列表裡的元素一一提取出來後再添加到原列表。x_list=[2333,'python',['a','b','c']]x_list.extend(['MySQL','SPSS'])print(x_list)以上代碼執行的結果為:insert():根據指定索引插入新的元素語法:列表名.insert(插入位置的索引,插入的元素)#在變量索引為1的位置插入元素'MySQL'x_list=[2333,'python',['a','b','c']]x_list.insert(1,'MySQL')print(x_list)以上代碼執行結果為:2.2.2 元素的刪除
pop():刪除指定索引(默認為-1)對應的元素,並返回所刪除的值語法:列表名.pop(索引值)#刪除變量中索引為1的元素x_list=[2333,'python',['a','b','c']]x_list.pop(1)print(x_list)以上代碼執行結果為:remove():刪除指定元素,若匹配到多項,僅刪除匹配到的第一項語法:列表名.remove('需刪除的元素')#刪除指定元素'a',僅刪除匹配到的第一項z_list=['a','b','c','a']z_list.remove('a')print(z_list)以上代碼執行結果為:clear():清空列表裡所有元素,返回一個空列表語法:列表名.clear()#清空變量x_list的所有元素x_list=[2333,'python',['a','b','c']]x_list.clear()print(x_list)以上代碼執行結果為:2.2.3 元素的查找
index():查找元素首次出現位置對應的正索引語法:列表名.index(查找的元素,起始索引,結束索引)#查找元素'python'在變量x_list中首次查找到位置的索引x_list=[2333,'python',['a','b','c']]x_list.index('python')以上代碼執行的結果為:注意:若查找的元素不在該列表中會報錯誤提示。count():查找元素在該列表中出現的次數語法:列表名.count(查找的元素)#查找元素'python'在變量x_list中出現的次數y_list=[2,3,4,5,2,2,3]y_list.count(2)以上代碼執行結果為:注意:列表中沒有方法find()。2.2.4 元素的排序
sort():對列表元素進行排序,返回元素按升序(默認)或降序排列的列表語法:列表名.sort(reverse=True/False)reverse:可選參數,默認為True即升序,若為False即降序#對變量y_list的元素進行降序排列y_list=[2,3,4,5,2,2,3]y_list.sort(reverse=True)print(y_list)以上代碼執行結果為:reverser():將列表內元素按逆序排列語法:列表名.reverser()#對y_list的元素進行逆序排列y_list=[2,3,4,5,2,2,3]y_list.reverser()print(y_list)以上代碼執行結果為:2.2.5 列表的複製
copy():用於複製列表用法:列表名.copy()y_list=[2,3,4,5,2,2,3]y=y_list.copy()print(y)
以上代碼執行結果為:
注意區分賦值、淺複製copy()、深複製deepcopy():
賦值:對象的簡單引用淺複製:複製列表的父對象,但不複製對象內部的子對象深複製:複製列表的父對象及子對象,需先導入copy模塊2.3 常用內置函數
除了序列通用的內置函數:len()、max()、len(),列表還含有以下內置函數:
list():將其他類型強制轉化為列表zip():將多個列表或元祖(後續會介紹)對應位置的元素組合為元祖,返回 zip對象enumerate():將一個可遍歷對象(如列表、字符串)組合成一個含數據和數據索引的序列3、元祖
3.1 元祖簡介
元祖與列表一樣是python的一種序列類型,可以使用序列的所有通用操作。元祖在python中以小括號「()」為標識,將一個或多個元素(以逗號分隔)括起來為一個元祖,其用法與列表非常類似,二者主要區別在於,列表內的元素可以修改,元祖內的元素不能修改,可以簡單把元祖理解為列表的一個「可讀版本」。
#元祖的創建x_tuple=('a',2,[3,4])print(x_tuple)#元素修改會報錯x_tuple[1]=3
以上代碼執行結果為:
注意:創建只有一個元素的元祖時,需要在後面加一個逗號,否則會返回元素本身。因為在python中小括號「()」同時也是數學運算上的一個基本符號,如(1+1)^2,如果創建只有一個元素的元祖時不加逗號分隔,python解釋器會將小括號識別為數學運算符號。
y_tuple=(2333,)print(y_tuple)z_tuple=(2333,)print(z_tuple)
以上代碼執行結果為:
3.2 常用方法及內置函數
3.2.1 常用方法
由於元祖的元素不可變性,元祖無法對元素進行增加、刪除、排序及複製操作,元祖中元素的查找與上述列表中用法一致。
x_tuple=('a',2,[3,4])#元素的查找x_tuple.index('a')#元素的複製x_tuple.count(2)
以上代碼執行的結果為:
注意:當元祖中所含元素為列表(可變序列)時,該列表嵌套項是可變的。
x_tuple=('a',2,[3,4])#修改列表[3,4]中的元素,元祖也隨之'變化'x_tuple[2][1]=3print(x_tuple)
以上代碼執行結果為:
3.2.2 常用內置函數
len(tuple):返回元祖元素的個數max(tuple):返回元祖元素最大值min(tuple):返回元祖元素最小值tuple(seq):將序列轉換為元祖3.2.3 選擇元祖or列表
特點:列表:動態存儲,長度大小可變,可對元素進行增刪查改等操 作,但儲存內存較大,性能偏差;元祖:靜態存儲,長度大小固定,不可隨意更新數據,內存佔用空間小,處理速度快;使用場景:列表:需隨時對數據進行更改,不考慮性能;元祖:1. 數據需要被「鎖定」,不能隨意更改; 2. 對性能有要求,如遍歷; 3. 作為數據結構的一部分,如字典的key