python學習之列表
- 2020 年 1 月 14 日
- 筆記
python的6個序列的內置類型
序列是python的最基本數據結構,序列的每個元素都分配一個數字,它的索引,第一個是0,第二個是1,依次類推; python的6個內建的序列分別是列表,元祖,字元串,unicode字元串,buffer對象和xrange對象; 序列通用操作包含:索引,長度,組合(序列相加),重複(乘法),分片,檢查成員,遍歷,最大值和最小值;
列表
列表是python最常用的數據類型,使用方括弧定義,元素之間使用逗號隔開;
列表的常用方法
1.定義一個列表
#定義一個空的列表 list1 = [] print(list1,type(list1)) #定義一個單值列表 list2 = ['hello'] print(list2,type(list2)) #定義一個普通列表 list3 = [1,'hello',[2,'world']] print(list3,type(list3)) 輸出結果: [] <class 'list'> ['hello'] <class 'list'> [1, 'hello', [2, 'world']] <class 'list'>
2.列表的索引
list4 = [1,2,3,4,5,6] print(list4[:]) #索引從0開始到索引值為列表長度結束 print(list4[:4]) #索引從0開始到4結束 print(list4[2:]) #索引從0開始到列表長度結束 print(list4[1:6:2]) #索引從1開始到6結束,步長為2 print(list4[::-1]) #將列表元素進行反轉顯示 輸出結果: [1, 2, 3, 4, 5, 6] [1, 2, 3, 4] [3, 4, 5, 6] [2, 4, 6] [6, 5, 4, 3, 2, 1]
3.列表的增加
1.使用append()函數追加其他元素到列表裡 list4.append(7) print(list4) list4.append('abc') print(list4) 輸出結果: [1, 2, 3, 4, 5, 6, 7] [1, 2, 3, 4, 5, 6, 7, 'abc'] 3.2.extend()函數追加其他列表的元素到指定的列表; list4.extend(list3) print(list4) 輸出結果: [1, 2, 3, 4, 5, 6, 7, 'abc', 1, 'hello', [2, 'world']] 3.使用insert()函數為列表指定位置添加元素 list4.insert(2,'100') print(list4) 輸出結果: [1, 2, '100', 3, 4, 5, 6]
4.列表的刪除
1.remove()函數刪除後列表的值進行改變 list4.remove('100') print(list4) list4.remove(5) print(list4) 輸出結果: [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 6] 2.pop()函數刪除指定索引值 list4.pop() #默認情況下刪除最後一個元素 print(list4) list4.pop(-1) #刪除列表最後一個元素 print(list4) list4.pop(1) #刪除列表索引值為2的元素 print(list4) 輸出結果: [1, 2, 3, 4] [1, 2, 3] [1, 3] 3.del()刪除列表元素,也可以通過索引以及切片刪除指定位置的元素 del(list4[0]) print(list4) del(list4) #將整個列表刪除,輸出值沒有 print(list4) 輸出結果: [3] 4.clear()函數清空列表的元素,使之成為空元素 list5 = [9,8,7,6,5] list5.clear() print(list5) 輸出結果: []
5.列表的修改
l1 = [0,1,2,3,4,5] l1[3] = 'abc' print(l1) 輸出結果: [0, 1, 2, 'abc', 4, 5] l1 = [0,1,2,3,4,5] l1[:3]='abcdef' print(l1) 輸出結果: ['a', 'b', 'c', 'd', 'e', 'f', 3, 4, 5]
6.列表的複製 在python中,對於複製問題,存在深拷貝和淺拷貝問題;兩者的區別在於,從原來的列表裡面複製出新的列表,修改其中的任意一個是否會對另外一個造成影響,即這兩個列表在記憶體中是否存儲在同一區域,這是區分深拷貝和淺拷貝的重要依據; 複製的願望是複製的列表之間不會相互影響;
1.直接賦值方法,是一種非拷貝方法; l1 = [1,2,3,4,5] l2 = l1 #將l1的值賦值給l2 print(l1,id(l1)) print(l2,id(l2)) #修改l1查看是否會影響到l2 l1.append(6) print(l1,id(l1)) print(l2,id(l2)) 輸出結果: [1, 2, 3, 4, 5] 7758408 [1, 2, 3, 4, 5] 7758408 [1, 2, 3, 4, 5, 6] 7758408 [1, 2, 3, 4, 5, 6] 7758408 修改l1導致l2也隨之變化; 2.淺拷貝的方式 l2 = [1,2,3,'abc','efg'] l3 = l2.copy() print(l2,id(l2)) print(l3,id(l3)) l2.append('hij') print(l2,id(l2)) print(l3,id(l3)) 輸出結果: [1, 2, 3, 'abc', 'efg'] 5136968 [1, 2, 3, 'abc', 'efg'] 5137032 [1, 2, 3, 'abc', 'efg', 'hij'] 5136968 [1, 2, 3, 'abc', 'efg'] 5137032 l2 = [1,2,3,'abc','efg'] l4 = l2[:] print(l2,id(l2)) print(l4,id(l4)) 輸出結果: [1, 2, 3, 'abc', 'efg'] 34807752 [1, 2, 3, 'abc', 'efg'] 33972808 3.深拷貝的方式 deepcopy()方法,無論多少層,無論怎樣的形式,得到新的列表和原來無關; 使用該函數時需要導入copy模組; import copy l2 = [1,2,3,'abc','efg'] l3 = copy.deepcopy(l2) print(l2,id(l2)) print(l3,id(l3)) l3.append('hij') print(l2,id(l2)) print(l3,id(l3)) 輸出結果: [1, 2, 3, 'abc', 'efg'] 31946504 [1, 2, 3, 'abc', 'efg'] 31945288 [1, 2, 3, 'abc', 'efg'] 31946504 [1, 2, 3, 'abc', 'efg', 'hij'] 31945288
7.列表的長度,重複,組合,成員操作以及遍歷
l1 = [0,1,2,3,4,5] l2 = [1,2,3,'abc','efg'] print(len(l2)) print(l1+l2) print(l1*3) print(5 in l1) for i in l1: print(i) 輸出結果: 5 [0, 1, 2, 3, 4, 5, 1, 2, 3, 'abc', 'efg'] [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5] True 0 1 2 3 4 5
8.反向列表中的元素
l1 = [0,1,2,3,4,5] l1.reverse() print(l1) 輸出結果: [5, 4, 3, 2, 1, 0]
9.列表的排序 列表的sort函數是按照ASSIC碼進行排序
l2 = [1,7,3,9,8,5] l2.sort() print(l2) l3 = ['a','f','r','d'] l3.sort() print(l3) l4 = [5,8,1,4,'c','f'] #列表的sort函數不支援整型和字元串的排序,不然執行會報錯 l4.sort() print(l4) 輸出結果: [1, 3, 5, 7, 8, 9] ['a', 'd', 'f', 'r'] 報錯: TypeError: '<' not supported between instances of 'str' and 'int'
10.列表的zip()函數 zip()將多個序列中的元素配對,從而產生新的元組列表;zip可以接受任意數量的序列,最終得到的元組數量由最短的序列決定;
l1 = [1,2,3,4,5] l2 = ['a','b','c','d','e'] l3 = [6,7,8,9,10] l4 = zip(l1,l2,l3) print(l4,type(l4)) for i in l4: print(i) 輸出結果: <zip object at 0x00000000021C7388> <class 'zip'> (1, 'a', 6) (2, 'b', 7) (3, 'c', 8) (4, 'd', 9) (5, 'e', 10)
對於「已壓縮的」(zipped)序列,對該序列進行解壓(unzip,用*表示);就是將一組行轉換為一組列
l4 = [(1, 'a', 6),(2, 'b', 7),(3, 'c', 8),(4, 'd', 9),(5, 'e', 10)] n1,n2,n3 = zip(*l4) print(n1) print(n2) print(n3) 輸出結果: (1, 2, 3, 4, 5) ('a', 'b', 'c', 'd', 'e') (6, 7, 8, 9, 10)
列表作為棧使用
使用列表作為堆棧使用,最後一個插入,第一個先出,(後近先出)。要添加到堆棧的頂端使用append()函數,取出堆棧的第一個元素使用pop()函數;
l2 = ['abc',5,8,'efc'] l2.append(1000) print(l2) l2.pop() print(l2) 輸出結果: ['abc', 5, 8, 'efc', 1000] ['abc', 5, 8, 'efc']
列表作為隊列使用
列表也可以用作隊列,其中先添加的元素被最先取出 (「先進先出」);然而列表用作這個目的相當低效。因為在列表的末尾添加和彈出元素非常快,但是在列表的開頭插入或彈出元素卻很慢 ; 若要實現一個隊列, collections.deque 被設計用於快速地從兩端操作;