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 被設計用於快速地從兩端操作;