- 很久以前就像學python了,還寫過一篇文章Python入門筆記1-基本數據類型,但是後來各種事情耽擱就沒怎麼看了,現在開始繼續學習
- 參考書《Python基礎教程(第三版)》—— Magnus Lie Hetland
一、序列
- Python中最基本的數據結構爲序列(這是一個統稱,包含
列表
/元組
/字符串
等多種結構),序列中每個元素都有索引編號,從0開始。Python也支持從隊尾找起的負索引。
1. 序列概述
- 列表、元組、字符串都屬於序列
- 列表是可以修改的,但元組不行。
- 列表/元組中可以放不同類型的變量,也可以包含其他列表/元組
>>> data1 = ['NO.1',1] #列表
>>> data2 = ['NO.2',2] #列表
>>> dataSet = [data1,data2] #列表
>>> dataSet
[['NO.1', 1], ['NO.2', 2]]
2. 序列的通用操作
- 所有序列都支持以下操作:索引、切片、相加、相乘、成員資格檢查、迭代。還有一些內置函數可以用來找出序列中的最大最小值、序列長度等
(1)索引
- 序列中所有元素都有編號,左起第一個爲0,右起第一個爲-1
>>> data1=['NO.1',1]
>>> data1[0]
'NO.1'
>>> data1[-1]
1
>>> data1[1]
1
>>> data1[-2]
'NO.1'
- 對於序列字面量,可以直接進行索引,不用把它賦給變量
>>> ['Hello',1,'World',2][-2]
'World'
>>> "World"[-1]
'd'
- 如果函數返回一個序列,可以在調用的時候直接索引
>>> X = input("year:")[3] # input讀取鍵盤輸入並返回一個字符串
year:2019 # 輸入2019
>>> X
'9'
(2)切片
- 切片用於訪問特定範圍內的元素,需要兩個索引
- 形式
序列[begin,end,(step)]:序列
,begin和end是兩個索引,返回一個新序列,值爲原序列下標[begin,end)區間。步長參數step可以不寫,缺省步長爲1
>>> num = "0123456789"
>>> num[2:5]
'234'
>>> num[-3:-1]
'78'
- 要切片結束於末尾,省略第二個索引;要切片起始於開頭,省略第一個索引
>>> num = "0123456789"
>>> num[2:]
'23456789'
>>> num[:3]
'012'
>>> num[:]
'0123456789'
- 步長:切片時添加元素的間隔,默認爲1,但也可以顯式指定
- 也可以有負數步長,這時從右往左取數
- 注意步長不能是0,否則報錯
>>> num = "0123456789"
>>> num[::2]
'02468'
>>> num[2:7:3]
'25'
>>> num[8:3:-1] #可以有負數步長
'87654'
>>> num[1:5:-2]
''
(3)相加
- 可以用加法拼接同型的序列,但是一般不能拼接不同型序列
- 返回一個新列表,不是原地修改
>>> data1 = ['NO.1',1]
>>> data2 = ['NO.2',2]
>>> data1 + data2 #拼接兩個列表
['NO.1', 1, 'NO.2', 2]
(4)乘法
- 序列與數字x相乘,表示重複這個序列x次
- 返回一個新列表,不是原地修改
>>> data1 = ['NO.1',1]
>>> data1*3
['NO.1', 1, 'NO.1', 1, 'NO.1', 1]
>>> [32]*10
[32, 32, 32, 32, 32, 32, 32, 32, 32, 32]
- 可以用乘法來初始化列表。Python中用
none
表示“什麼都沒有”,因此可按如下方法把列表長度初始化爲10
>>> sequence = [None]*5 #sequence長度爲5
>>> sequence
[None, None, None, None, None]
(5)成員資格
- 要檢查特定的值是否在序列中,可以使用運算符
in
,返回bool值True/False
>>> num = '0123456789'
>>> '1'in num
True
>>> 'a'in num
False
>>> input('Enter a number: ')in num
Enter a number: 3
True
二、列表(list)
- 列表是序列的一種,這裏主要討論列表不同於元組和字符串的地方
- 列表是可變的,可以修改其內容
- 列表有很多特有方法
1. 創建列表
- 將元素用‘,’分割,加個方括號
>>> lst = [1,2,'A','string']
>>> lst
[1,2,'A','string']
2. 序列轉換爲列表list(x)
List(x)
:List函數可以把任何序列x轉換爲列表。(list實際是一個類,這個其實是列表的構造函數之一)
>>> list("1234567890")
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
>>> list([1,"10"])
[1, '10']
- 可以用
''.join(list)
把字符列表list還原爲字符串- list中的元素必須都是char
- 這個join方法其實是把list中每個char放到str前面重複,這裏放了一個空串,所以看起來是把list中字符拼成字符串了
>>> ''.join(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'])
'1234567890'
>>> string = 'ABC'.join(['1','2','3','4','5'])
>>> string
'1ABC2ABC3ABC4ABC5'
3. 列表基本操作
(1)給元素賦值
- 使用
[]
索引找到列表中一個元素並重新賦值(注意不要越界)
(2)刪除元素
- 刪除元素:使用
del list[n]
來刪除列表list中第n個元素(字典類型也支持這個)
>>> list = [1,2,3]
>>> list[1] = 103 #賦值
>>> list
[1, 103, 3]
>>> del list[1] #刪除
>>> list
[1, 3]
(3)切片賦值
- 通過給切片賦值,可以將切片替換爲長度不同的序列
- 可以在不刪除原有元素的情況下插入新元素
- 可以用來刪除元素
>>> name = list("12345") #切片賦值
>>> name[2:4]="abcd"
>>> name
['1', '2', 'a', 'b', 'c', 'd', '5']
>>> name = [1,5] #插入元素(本質是切片賦值)
>>> name[1:1] = [2,3,4]
>>> name
[1, 2, 3, 4, 5]
>>> name = [1,5] #刪除元素(本質是切片賦值)
>>> name[0:1] = []
>>> name
[5]
4. 列表方法
- 列表list本身是一個類,這個類提供了若干方法。調用方法類似C/C++語言
(1)append(x): None方法
- 添加一個對象到列表末尾
- append方法就地修改列表,不會返回新列表
>>> num = list("12345")
>>> num
['1', '2', '3', '4', '5']
>>> num.append(6)
>>> num.append(“ABC”)
>>> num
['1', '2', '3', '4', '5', 6,'ABC']
#下面這個程序不好,因爲list是一個內置函數,如果用list起名,會導致list函數不能使用
>>> list = ["a",1]
>>> list.append("Hello")
>>> list
['a', 1, 'Hello']
(2)clear(): None方法
- 方法clear就地清空列表,類似切片語句
lst[:]=[]
>>> lst = list("Hello")
>>> lst
['H', 'e', 'l', 'l', 'o']
>>> lst.clear()
>>> lst
[]
(3)copy(): list方法
- 常規賦值(如下)只是將另一個名字關聯到列表(類似C中typedef別名)
>>> lst_A = []
>>> lst_B = lst_A
>>> lst_B
[]
>>> lst_B.append("abc")
>>> lst_A
['abc']
- 方法copy複製列表,返回一個新列表,它是原列表的副本,這樣就能把新列表變量關聯到新列表,從而讓列表副本和原本獨立
>>> lst = []
>>> lst_ = lst.copy()
>>> lst_.append("123")
>>> lst_
['123']
>>> lst
[]
(4)count(x): integer方法
- 方法count統計指定元素再列表中出現了幾次
>>> [1,2,3,3,3,4,5,6].count(3)
3
(5)extend(x): None方法
- 方法extend同時添加多個值到列表末尾也就是說在列表末尾添加另一個列表
- extend類似列表拼接”+”,區別在於extend是在原表上修改,”+”返回了新列表
a = a + b
比a.extend(b)
效率低- 還可以用切片實現extend效果,但是可讀性差
#extend方法
>>> lst = [1,2,3,4]
>>> lst.extend(list("abcde"))
>>> lst
[1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']
#用切片實現
>>> lst = [1,2,3,4]
>>> lst[len(lst):] = list("abcde")
>>> lst
[1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']
#用+運算實現
>>> lst = [1,2,3,4]
>>> lst += list("abcde")
>>> lst
[1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']
(6)index(x): integer方法
- index查找列表中指定值第一次出現的索引,如果不存在指定值會報錯
>>> [1,2,3,4].index(1)
0
(7)insert(n,object): None方法
list.insert(n,object)
用於將一個對象插入列表,位置爲n- 用切片也可以實現類似效果,但可讀性不好
#insert
>>> a = [1,2,3]
>>> a.insert(2,"a")
>>> a
[1, 2, 'a', 3]
#切片實現
>>> a = [1,2,3]
>>> a[2:2]="a"
>>> a
[1, 2, 'a', 3]
(8)pop(): object方法
- pop從列表末尾刪除一個元素,並把它返回
- pop是唯一一個即修改原列表,又返回非none值的方法
>>> a = [1,2,3]
>>> b = a.pop()
>>> a
[1, 2]
>>> b
3
(9)remove(obj): None方法
list.remove(obj)
刪除列表中第一個爲obj的元素,如果表中不存在此元素會報錯- 就地修改列表且無返回
>>> a = [1,2,3,4,5]
>>> a.remove(3)
>>> a
[1, 2, 4, 5]
(10)reverse(): None方法
- 就地修改列表且不返回值,將列表就地反向排列
>>> a = [1,2,3,4,5]
>>> a.reverse()
>>> a
[5, 4, 3, 2, 1]
(11)sort(): None方法
- 對列表就地排序(默認從小到大),不返回值。從python2.7開始這個是穩定的排序算法
>>> a = [1,3,2,5,4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]
#不要這樣做,這樣只會對a排序,b爲none
>>> a = [1,3,2,5,4]
>>> b = a.sort()
#先把b關聯(=)到a的副本,再sort
>>> a = [1,3,2,5,4]
>>> b = a.copy()
>>> b.sort()
>>> b
[1, 2, 3, 4, 5]
- 還可以使用內置函數
sorted(object):list
達到類似的效果。 Sorted函數可以用於任何序列(實際上,適用於任何可迭代對象),總是返回一個列表
>>> a = [1,3,2,5,4]
>>> b = sorted(a)
>>> b
[1, 2, 3, 4, 5]
#sorted函數可用於任何可迭代對象
>>>sorted(“Python”)
>>>[‘P’, ’h’ , ’n’ , ’o’ , ’t’ , ’y’]
(12)高級排序
- sort方法和sorted函數都可以接受兩個可選參數:key和reverse,它們是按名稱指定的,稱爲關鍵字參數
-
Key指定排序的標準,類似C++中sort函數的cmp參數,區別在於,cmp函數直接判斷元素相對大小,Key參數則是用來對每個元素創建一個鍵,再根據這些鍵排序。Key可以設置爲自定義函數(後面再講)
-
Reverse指定從小到大還是從大到小,只需將其指定爲True或False,代表要不要按相反的順序進行排序
-
#Key參數
>>> X = [‘123’ , ‘12’ , ‘1’ ]
>>> X.sort(Key = len) #假設Key的函數已經寫好了
>>> X
[‘1’ , ‘12’ , ‘123’]
#reverse參數
>>> X = [1,2,3,4]
>>> X.sort(reverse = True)
>>> X
[4,3,2,1]
(13)小結
- 無返回值的方法:
append / clear / extend / insert / remove / reverse / sort
- 有返回值的方法:
copy
:返回副本列表
count
:返回指定元素出現次數
index
:返回指定元素首次出現的索引
pop
:返回表中最後一個元素 - 對列表進行就地修改的方法:
append / clear / extend / pop / remove / reverse / sort
三、元組(tuple)
- 元組和列表一樣都是序列,區別在於元組不可以修改
1、創建一個元組
- 將元素用‘,’分割即可,也可以加個圓括號
>>> 1,2,3
(1, 2, 3)
>>> (1,2,3)
(1, 2, 3)
- 空元組:用空括號表示
>>> ()
- 只有一個元素的元組:在值後加一個逗號
#注意不能(1)這樣,要加括號只能寫成(1,)
>>> 1,
(1,)
>>>(42) #一個值直接加括號是沒用的
>>>42
>>> 3*(40+2) #這樣不能創建元組
126
>>> 3*(40+2,) #創建了元組,逗號至關重要
(42, 42, 42)
2、序列轉換爲元組
- 類似list類,tuple類可以把序列轉爲元組
#字符串 -> 元組
>>> a = tuple("Hello")
>>> a
('H', 'e', 'l', 'l', 'o')
#列表 -> 元組
>>> a = list("1234")
>>> a
['1', '2', '3', '4']
>>> b = tuple(a)
>>> b
('1', '2', '3', '4')
3、元組相關操作
- 元組的創建和訪問方法和列表完全類似
- 因爲元組不可修改,其他沒有什麼可以對元組進行的操作了
4、元組的作用
- 用作映射中的鍵(以及集合的成員)
- 有些內置函數返回元組
- 一般而言只用列表就可以滿足要求了,幾乎所有情況下都可以用列表代替元組(除非元組用作字典鍵,這是不可以修改的)