給妹子講python--01好用的列表

陪伴學習,一路成長,溫馨而有趣。當然,也記得一起關注,一起點贊吧!

Python中有一種被稱之為「容器」的數據類型,專門用來存放其他類型的對象,就好比小時候用的文具盒,裡面放著鉛筆、尺子、橡皮等等。很多人剛剛使用Python的時候,往往最先接觸的就是這種容器對象,比如列表、字典、元組等等。它們功能全面,使用也很方便,可以解決很多實際問題。我首先給妹子聊的就是Python容器,第一個介紹的是列表:

【妹子首先就問了】列表是不是就和原來在C語言里學過的數組長得很像?

這個只能直觀上這麼類比,實際上對比C語言的數組,Python列表要靈活方便許多,它有這麼幾個優點:

1.它能包含不同種類、任意類型的對象,甚至可以嵌套列表,這是C語言數組所不具備的,這稱之為異構性

2.不僅可以像C語言數組那樣用位置序號索引,還能通過分片方式索引一個列表的片段,我們叫它有序性

3.列表的大小和內容可以隨意改變,在插入、刪除、修改列表元素時,不需要建立一份新的列表拷貝,而是在原來的內存地址上直接修改列表對象。

【妹子說】:好啦,一下子說了這麼多概念,還是舉幾個直觀的例子吧

行啊,那就邊擼代碼,哦不,邊寫代碼邊比劃。

關於第一點異構性,很簡單

L1 = [1, 2, 3, 4, 5]nL2 = [1, spam, [2.3, 4]]nL3 = []n

看這三個列表的初始化過程,異構性就搞清楚了,特別是L2列表,它同時包含了好幾種不同的數據類型,甚至還嵌套了列表。

【妹子說】:那第二點有序性,就是類似用L1[2]這種方式來訪問列表中的元素咯。

這個只是最簡單的一種,我來重點來說說分片操作這個獨特用法,先看看這個例子:

L = [1,2,3,4,5,6,7,8]nprint(L[1:3])nn[2, 3]n

我們從列表L中從左往右截取了一個片段。關於截取片段左右邊界與索引值的對應關係,我們只需記住這麼一個口訣「左閉右開」就OK了:

分片索引中第一個參數1表示左側開始的索引1(從0開始計數),因此起始的元素就是整形數2,第二個參數3表示在右側終止的索引值為3,即整形數4,但要記住他是不包含在截取的序列中的。

還有幾種常見用法:

如果省略掉終止索引,就表示一直截取到末尾:

L = [1,2,3,4,5,6,7,8]nprint(L[1:])nn[2, 3, 4, 5, 6, 7, 8]n

同理,如果省略掉起始索引,就表示從起始元素就開始截取

L = [1,2,3,4,5,6,7,8]nprint(L[:4])nn[1, 2, 3, 4]n

還可以用負索引,目前我們使用的都是正索引,即從左往右的索引值,最左側的索引值為0,往右依次加1;還有一種負索引的表示法,即從右往左數,最右側是-1,往左依次減1,即-2,-3以此類推。

L = [1,2,3,4,5,6,7,8]nprint(L[3:-1])nn[4, 5, 6, 7]n

【妹子問】:那我想跳著截取呢?

那就用上第三個參數,步進值參數,這個默認是1,即1個挨著1個的取,如果我們想跳著截取,那就得專門設置這個步進參數了。

L = [1,2,3,4,5,6,7,8]nprint(L[0::2])nn[1, 3, 5, 7]n

這時候【妹子問了一個很有內涵的問題】:我對截取出的分片進行修改,會影響到原始的列表嗎?

那我們還是眼見為實:

L = [1,2,3,4,5,6,7,8]nb = L[3:-1]nprint(before change:b={}.format(b))nb[0]=111nprint(after change:b={}.format(b))nprint(after change:L={}.format(L))nnbefore change:b=[4, 5, 6, 7]nafter change:b=[111, 5, 6, 7]nafter change:L=[1, 2, 3, 4, 5, 6, 7, 8]n

很明顯,對原始列表L進行分片切割後,產生了一個全新的列表。用變數b獲取了L的分片後,實質是獲取了L分片的一個新的獨立拷貝。因此,你在列表b上做修改,是影響不了L的。

【妹子說】第三點關於修改的部分,應該是涉及到增刪改這三大塊吧

沒錯,說到底就是增刪改,要注意,這都是在原始的列表上完成的修改。

首先看增加新元素的三個使用場景

L = [1,2,3,4]nL.append(5)nprint(L)nn[1, 2, 3, 4, 5]nnL = [1,2,3,4]nL.insert(1,10)nprint(L)nn[1, 10, 2, 3, 4]nnL = [1,2,3,4]nL.extend([11,22,33])nprint(L)nn[1, 2, 3, 4, 11, 22, 33]n

這三個用法有些不同,append方法只能在尾部加入;insert方法可在任意位置加入,比如上面例子,我們在列表的索引位置為1的地方加入元素10,如果指定的索引值大於序列的總長度,則自動加到末尾;extend方法則可以在尾部一次性加入多個元素

這時,【妹子自己操作了一把】

L = [1,2,3,4,5]nL = L.insert(6,2)nprint(L[2])nnTraceback (most recent call last):n File "E:/12homework/12homework.py", line 3, in <module>nprint(L[2])nTypeError: NoneType object is not subscriptablen

然後,就沒有然後了。。。這裡犯了一個常見的錯誤,因為我們說過插入是就地修改,而不是返回修改後的新列表。Insert方法的返回值是None,這麼干換句話說,會徹底失去之前列表的引用,因為你把None值賦給了L,你就無法找到之前的列表了。append和extend方法也是這樣。

刪除,依據使用需求也有這幾種使用場景

最簡單直接的,用remove方法,傳入指定要刪除的對象,注意:它也是在原列表上就地刪除,返回值為None

L1 = [aa,bb,cc]nL1.remove(aa)nprint(L1)nn[bb, cc]n

這裡注意,還有一個內置方法del,它額外的功能是可以刪除列表中的一個分片

del L1[1:3]n

還有一個pop方法,它在末端刪除一個元素,並可以將刪除的元素作為返回值返回給調用者

L1 = [1,2,3]nprint(L1.pop())#末端刪除一個元素,彈出刪除的值nprint(L1)nn3n[1, 2]n

【妹子問】那麼元素修改,除了像下面這種直接用索引做元素修改的情況外,還有什麼有趣的用法?

L = [4,5,6,7,8,9]nL[0] = 0n

那必須要來點有意思的,主要就說分片賦值本地排序這兩個問題:

L = [4,5,6,7,8,9]nL[1:3] = [aa,bb,cc,dd]nprint(L)nn[4, aa, bb, cc, dd, 7, 8, 9]n

分片賦值的本質是先在原列表上刪除指定分片,然後在刪除的位置插入新的列表,因此左右兩邊的長度可以不等。

本地排序非常方便,看看下面的例子就明白了。注意排序也是在本地修改,而不是將排好序的列表作為返回值返回。

L = [1,5,3,8,3,2,10]nL.sort()nprint(L)nL.reverse()nprint(L)nn[1, 2, 3, 3, 5, 8, 10]n[10, 8, 5, 3, 3, 2, 1]n

【妹子說】聽你講了這麼多,列表的基本用法算是弄明白了,那下次再講講字典和元組吧。


推薦閱讀:

Python入門 數據結構 dict字典
利用簡書首頁文章標題數據生成詞雲
學習筆記三:改善Python程序的91個建議
利用 Python 打造反向 TCP 後門
Python從零開始系列連載(13)——Python程序的基本控制流程(上)

TAG:Python教程 | 数据结构 | 自学编程 |