List—列表
創建list
Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。
比如,列出班里所有同學的名字,就可以用一個list表示:
list是數學意義上的有序集合,也就是說,list中的元素是按照順序排列的。
構造list非常簡單,按照上面的代碼,直接用 [ ] 把list的所有元素都括起來,就是一個list對象。通常,我們會把list賦值給一個變量,這樣,就可以通過變量來引用list:
由于Python是動態語言,所以list中包含的元素并不要求都必須是同一種數據類型,我們完全可以在list中包含各種數據:
一個元素也沒有的list,就是空list:
列表生成
要生成list[1,2,3,4,5,6,7,8,9,10],我們可以用range(1,11):
但如果要生成[1×1, 2×2, 3×3, …, 10×10]怎么做?方法一是循環:
但是循環太繁瑣,而列表生成式則可以用一行語句代替循環生成上面的list:
這種寫法就是Python特有的列表生成式。利用列表生成式,可以以非常簡潔的代碼生成 list。
寫列表生成式時,把要生成的元素 x * x 放到前面,后面跟 for 循環,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
按照索引訪問list
由于list是一個有序集合,所以,我們可以用一個list按分數從高到低表示出班里的3個同學:
那我們如何從list中獲取指定第 N 名的同學呢?方法是通過索引來獲取list中的指定元素。
需要特別注意的是,索引從 0 開始,也就是說,第一個元素的索引是0,第二個元素的索引是1,以此類推。
因此,要打印第一名同學的名字,用 L[0]:
要打印第二名同學的名字,用 L[1]:
要打印第三名同學的名字,用 L[2]:
要打印第四名同學的名字,用 L[3]:
報錯了!IndexError意思就是索引超出了范圍,因為上面的list只有3個元素,有效的索引是 0,1,2。
所以,使用索引時,千萬注意不要越界。
倒序訪問list
我們還是用一個list按分數從高到低表示出班里的3個同學:
這時,老師說,請分數最低的同學站出來。
要寫代碼完成這個任務,我們可以先數一數這個 list,發現它包含3個元素,因此,最后一個元素的索引是2:
有沒有更簡單的方法?有!
Bart同學是最后一名,俗稱倒數第一,所以,我們可以用 -1 這個索引來表示最后一個元素:
Bart同學表示躺槍。
類似的,倒數第二用 -2 表示,倒數第三用 -3 表示,倒數第四用 -4 表示:
L[-4] 報錯了,因為倒數第四不存在,一共只有3個元素。
使用倒序索引時,也要注意不要越界。
添加新元素
現在,班里有3名同學:
今天,班里轉來一名新同學 Paul,如何把新同學添加到現有的 list 中呢?
第一個辦法是用 list 的 append() 方法,把新同學追加到 list 的末尾:
append()總是把新的元素添加到 list 的尾部。
如果 Paul 同學表示自己總是考滿分,要求添加到第一的位置,怎么辦?
方法是用list的 insert()方法,它接受兩個參數,第一個參數是索引號,第二個參數是待添加的新元素:
L.insert(0, ‘Paul’) 的意思是,’Paul’將被添加到索引為 0 的位置上(也就是第一個),而原來索引為 0 的Adam同學,以及后面的所有同學,都自動向后移動一位。
刪除元素
Paul同學剛來幾天又要轉走了,那么我們怎么把Paul 從現有的list中刪除呢?
如果Paul同學排在最后一個,我們可以用list的pop()方法刪除:
pop()方法總是刪掉list的最后一個元素,并且它還返回這個元素,所以我們執行 L.pop() 后,會打印出 ‘Paul’。
如果Paul同學不是排在最后一個怎么辦?比如Paul同學排在第三:
要把Paul踢出list,我們就必須先定位Paul的位置。由于Paul的索引是2,因此,用 pop(2)把Paul刪掉:
替換元素
假設現在班里仍然是3名同學:
現在,Bart同學要轉學走了,碰巧來了一個Paul同學,要更新班級成員名單,我們可以先把Bart刪掉,再把Paul添加進來。
另一個辦法是直接用Paul把Bart給替換掉:
對list中的某一個索引賦值,就可以直接用新的元素替換掉原來的元素,list包含的元素個數保持不變。
由于Bart還可以用 -1 做索引,因此,下面的代碼也可以完成同樣的替換工作:
切片—對list進行切片
取一個list的部分元素是非常常見的操作。比如,一個list如下:
取前3個元素,應該怎么做?
笨辦法:
之所以是笨辦法是因為擴展一下,取前N個元素就沒轍了。
取前N個元素,也就是索引為0-(N-1)的元素,可以用循環:
對這種經常取指定索引范圍的操作,用循環十分繁瑣,因此,Python提供了切片(Slice)操作符,能大大簡化這種操作。
對應上面的問題,取前3個元素,用一行代碼就可以完成切片:
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。
如果第一個索引是0,還可以省略:
也可以從索引1開始,取出2個元素出來:
只用一個 : ,表示從頭到尾:
因此,L[:]實際上復制出了一個新list。
切片操作還可以指定第三個參數:
第三個參數表示每N個取一個,上面的 L[::2] 會每兩個元素取出一個來,也就是隔一個取一個。
把list換成tuple,切片操作完全相同,只是切片的結果也變成了tuple。
倒序切片
對于list,既然Python支持L[-1]取倒數第一個元素,那么它同樣支持倒數切片,試試:
記住倒數第一個元素的索引是-1。倒序切片包含起始索引,不包含結束索引。
對字符串切片
字符串 ‘xxx’和 Unicode字符串 u’xxx’也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以用切片操作,只是操作結果仍是字符串:
在很多編程語言中,針對字符串提供了很多各種截取函數,其實目的就是對字符串切片。Python沒有針對字符串的截取函數,只需要切片一個操作就可以完成,非常簡單。