Python第三課(序列之列表)

  • 在上一課中已經說明了列表是什麼,從本質上來說列表在Python中是一種數據結構,是一個通過稱之爲索引的序號標記的有序的許多元素組成的集合。列表中的元素是可以被改變的,這個特性是列表比元組更加靈活之處,因此列表也被更加廣泛的使用。

  1.創建一個列表

  Python中這些數據結構的創建非常的簡單,name=[1,2,3]就完成了一個名稱爲name,由三個元素1,2,3組成的列表;或者在Python交互解釋器中直接輸入中括號包含列表的元素;但是不將列表賦值給變量在使用起來會非常不方便所以還是使用變量名稱=列表的方法來創建列表比較好。

1 >>> num=[1,2,3,4,5,6]
2 >>> [1,2,3,4,5,6,7]
3 [1, 2, 3, 4, 5, 6, 7]

  2.list函數

  使用list函數可以根據序列創建列表,字符串和元組不能被修改,所以可以根據字符串或者元組創建一個列表進行修改,然後在根據修改後的字符串或者元組賦值給原來的變量。

1 >>> name='chine'
2 >>> num=(1,2,3)
3 >>> list(name)   ##根據字符串創建列表
4 ['c', 'h', 'i', 'n', 'e']
5 >>> list(num)    ##根據元組創建列表
6 [1, 2, 3]
  •  列表的基本操作

  1.修改列表:元素賦值

  使用普通的賦值語句就可以對列表中的元素賦值,使用索引來爲某個明確的元素賦值。不能爲一個不存在的元素賦值

1 >>> name=['lufei','suolong','namei','shanzhi','qiaoba','luobin']
2 >>> name[2]='haizeiwang'
3 >>> name
4 ['lufei', 'suolong', 'haizeiwang', 'shanzhi', 'qiaoba', 'luobin']   #索引爲2的元素的值已經改變

  2.刪除元素

  使用del函數來刪除列表中的元素,del函數也可以刪除其他的數據結構中的元素。使用del函數可以刪除列表中的單個元素、多個元素,可以使用分片刪除列表中的多個元素。

 1 >>> name
 2 ['lufei', 'suolong', 'haizeiwang', 'shanzhi', 'qiaoba', 'luobin']
 3 >>> del(name[3])    #刪除索引爲3的元素-刪除單個元素
 4 >>> name
 5 ['lufei', 'suolong', 'haizeiwang', 'qiaoba', 'luobin']
 6 >>> del (name[1],name[2])    #刪除多個元素,每個元素表達之間使用逗號隔開
 7 >>> name
 8 ['lufei', 'haizeiwang', 'luobin']
 9 >>> del(name[1:])           #使用分片操作刪除多個元素
10 >>> name
11 ['lufei']

  3.分片賦值

  分片賦值特別強大,提現在它操作起來特別的靈活,以至於列表的其他操作方法也可以使用分片賦值來實現。這裏僅說明分片賦值的使用,在說明其它操作時同時用分片對其它操作的實現進行說明。

1 >>> name
2 ['lufei']
3 >>> name[1:1]='suolong'
4 >>> name
5 ['lufei', 's', 'u', 'o', 'l', 'o', 'n', 'g']
6 >>> name[1:1]=['suolong']
7 >>> name
8 ['lufei', 'suolong', 's', 'u', 'o', 'l', 'o', 'n', 'g']

  使用分片賦值可以實現刪除操作,可以刪除列表中的單個元素或者刪除列表中的多個連續元素

1 >>> name
2 ['lufei', 'suolong', 's', 'u', 'o', 'l', 'o', 'n', 'g']
3 >>> name[2:]=[]
4 >>> name
5 ['lufei', 'suolong']
  •  列表方法

   方法是與一些對象具有緊密聯繫的函數。調用方法:對象.方法(參數)。對象和方法名之間需要用點號隔開。

  1.append

  用於在列表末尾追加新對象,該方法不是簡單的返回一個新列表,而是在原有列表的位置進行修改。這種修改方法在一般需求中適用,但是某些特殊情況下會很麻煩,在學習sort時會對這種情況進行說明。

1 >>> haizei=['lufei','namei']
2 >>> haizei.append('suolong')
3 >>> haizei
4 ['lufei', 'namei', 'suolong']

   適用分片賦值也可以實現append的操作,只需要把分片的分爲設置到最後一個元素即可

1 >>> haizei
2 ['lufei', 'namei', 'suolong']
3 >>> haizei[3:]=['shanzhi']
4 >>> haizei
5 ['lufei', 'namei', 'suolong', 'shanzhi']

  原列表中有三個對象,對象的索引分別是0、1、2,現在要適用分片賦值在列表的末尾追加一個對象‘shanzhi’。分片中的第一個索引是會被改變的值,所以第一個索引應該設置爲原列表中最後一個對象的索引的下一個索引序號,因爲是在列表的末尾追加,第二個索引可以不設置。

  假如現在要在列表的任意一位置插入對象,使用append不能夠實現,但是使用分片賦值是可以實現的。現在haizei列表的2位置插入兌現‘luobin’實現方法如下代碼:

1 >>> haizei
2 ['lufei', 'namei', 'suolong', 'shanzhi']
3 >>> haizei[2:2]=['luobin']      ##注意這裏在列表中任意位置插入對象時分片中的兩個索引的設置
4 >>> haizei
5 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']

  2.count

  統計某個元素在列表中出現的次數。返回統計出來的數字。

1 >>> haizei
2 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']
3 >>> haizei.count('luobin')
4 1
5 >>> haizei.count('qiaoba')
6 0

   3.extand(擴展)

  可以在列表的末尾一次性追加另一個列表中的多個元素。

1 >>> haizei
2 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']   #原列表
3 >>> num=[1,2,3]              #列表num
4 >>> haizei.extend(num)     #用列表num擴展原列表haizei
5 >>> haizei
6 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi', 1, 2, 3]   #擴展的結果是把列表num中的所有元素追加在原列表haizei的末尾
7 >>> haizei.extend(num[1:])     #用於擴展的列表是num中的部分元素,使用分片獲取
8 >>> haizei
9 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi', 1, 2, 3, 2, 3]    #結果

  在以上代碼中,對原列表進行擴展後,查看原列表內的元素可以看到,擴展是在原列表的位置上進行修改,而不是返回一個新的列表(區別於序列的通用操作中的連接操作)

 1 >>> haizei
 2 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']
 3 >>> a=[1,2,3]
 4 >>> haizei.extend(a)            #列表的擴展方法
 5 >>> haizei
 6 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi', 1, 2, 3]  #修改了原列表
 7 
 8 #使用序列的通用操作連接後的結果區別於列表的擴展
 9 >>> haizei
10 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']
11 >>> haizei+a
12 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi', 1, 2, 3]  #使用連接後,返回的是一個新的列表,未對原列表修改
13 >>> haizei
14 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']   #原列表並沒有改變

   從以上代碼中可以看出列表extend和序列的連接操作結果的區別。爲什麼是這樣的結果在學sort方法是學習具體分析。這裏需要說明的是連接操作的結果是返回一個包含haizei列表和a列表副本的新列表,列表的extend是在原列表haizei中追加了a列表中的元素,連接操作的效率比extend方法低。

  同樣extend方法也可以使用分片操作來實現:

1 >>> haizei
2 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi']
3 >>> a=[1,2,3]
4 >>> haizei[len(haizei):]=a
5 >>> haizei
6 ['lufei', 'namei', 'luobin', 'suolong', 'shanzhi', 1, 2, 3]

  4.insert方法

  在原列表中某個位置插入對象,方法調用時需要兩個參數一個是插入對象的位置,一個是插入的對象的值。從以下代碼中可以查出insert也是在原列表的位置修改列表。

1 >>> haizei
2 ['lufei', 'namei', 'suolong']
3 >>> haizei.insert(1,'shanzhi')
4 >>> haizei
5 ['lufei', 'shanzhi', 'namei', 'suolong']

   同樣insert也可以使用分片賦值來實現

1 >>> haizei
2 ['lufei', 'namei', 'suolong']
3 >>> haizei[1:1]=['shanzhi']
4 >>> haizei
5 ['lufei', 'shanzhi', 'namei', 'suolong']

  5.pop

  刪除列表中一個元素(默認是最後一個元素),然後返回該元素的值。pop是列表所有方法中唯一一個返回元素值的方法,同樣也是在原列表上就行刪除。是否可以修改刪除元素的位置。

1 >>> haizei
2 ['lufei', 'shanzhi', 'namei', 'suolong']
3 >>> haizei.pop()
4 'suolong'
5 >>> haizei
6 ['lufei', 'shanzhi', 'namei'

  pop方法同樣可以用分片賦值來實現:

1 >>> haizei
2 ['lufei', 'shanzhi', 'namei', 'suolong']
3 >>> haizei[3:]=[]
4 >>> haizei
5 ['lufei', 'shanzhi', 'namei']

   使用pop和append結合使用可以實現後進先出的數據結構-棧

  7.remove

  溢出列表中某個元素的第一個匹配項。remove是一個沒有返回值的原位置修改方法。remove方法執行後不返回任何值。

1 >>> haizei
2 ['lufei', 'shanzhi', 'namei', 'qiaoba', 'luobin', 'shanzhi']
3 >>> haizei.remove('shanzhi')
4 >>> haizei
5 ['lufei', 'namei', 'qiaoba', 'luobin', 'shanzhi']

  remove不能使用分片操作來實現,因爲他的參數不是列表的索引,而是列表中的元素。所有的根據列表中勻速索引對元素進行的增、刪、改、查操作使用分片都是可以實現的。

  8.reverse

  將列表中的元素方向存放,對原列表進行修改。

1 >>> haizei
2 ['lufei', 'namei', 'qiaoba', 'luobin', 'shanzhi']
3 >>> haizei.reverse()
4 >>> haizei
5 ['shanzhi', 'luobin', 'qiaoba', 'namei', 'lufei']

  9.sort

  在原位置對列表進行排序,改變原來的列表。

1 >>> num=[34,5,443,656,43,45,12,1]
2 >>> num.sort()
3 >>> num
4 [1, 5, 12, 34, 43, 45, 443, 656]

  以上代碼對列表num根據數字大小進行了排序。默認情況下sort函數根據Python的默認排序規則按牲畜排列元素。

  10.高級排序

  如果想要按照特定的方式對列表進行排序,則需要通過compare來給出排序規則。實現num的降序排序規則。

總結:

  列表是Python內建的6中序列之一,序列是Python中最常見的數據結構,數據結構是按照一定的方式組織在一起的n個元素的集合。

  列表可以執行的操作包含了序列的通用操作、列表的基本操作、列表的方法調用。

  通用操作:索引、分片、步長、成員資格、加法、乘法、長度、最大值、最小值。

  列表基本操作:list函數、賦值、刪除del、分片賦值。

  列表方法:append、insert、extend、pop、remove、index、reverse、sort。

  在列表的所有方法中,在返回值和修改方法上對列表又有不一樣的結果。

  返回值:append、insert、extend、reverse、sort返回的是一個列表

      pop返回的是一個元素的值

      index返回的是一個元素的索引位置

  是否在原列表修改:所有的方法除了index是查詢操作外,都在列表的原位置修改列表。這樣就對 一些特定需求的實現上產生了影響。

需求:在原列表的寄出上產生一個副本,返回修改後的副本。

1 >>> haizei
2 ['shanzhi', 'luobin', 'qiaoba', 'namei', 'lufei']
3 >>> a=haizei
4 >>> a.sort()
5 >>> haizei
6 ['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi']
7 >>> a
8 ['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi']

  在上述代碼中希望的是在保留原列表haizei不變的情況下返回經過排序後的原列表haizei的一個副本。

  執行a=haizei是想創建一個haizei的副本,然後副本a調用方法sort對副本進行排序。結果卻是原列表haizei和a都發生了改變。問題的關鍵是在創建副本時使用賦值只是把變量a的指針指向了原列表haizei的位置,並不是真正的創建了一個haizei的副本,此時a和haizei是指向同一個位置的,修改a或者是海賊本質上修改的都是同一個列表(這也說明了Python中的賦值在內存中實現的本質)。

  如何創建一個列表副本?先創建一個空的列表,然後使用分片賦值將原列表的所有元素都賦值給副本列表,此時在內存中就會存在兩塊地址空間分別存儲原列表和副本列表,這時對副本列表進行的任何操作就都和原列表沒有任何關係了。

 1 >>> haizei
 2 ['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi']
 3 >>> b=[]    #創建一個空列表作爲副本列表
 4 >>> b[0:]=haizei[:]      #將原列表的值都賦值給副本列表
 5 >>> b
 6 ['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi']
 7 >>> b.reverse()    #修改副本列表
 8 >>> haizei
 9 ['lufei', 'luobin', 'namei', 'qiaoba', 'shanzhi']
10 >>> b
11 ['shanzhi', 'qiaoba', 'namei', 'luobin', 'lufei']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章