本文內(nèi)容整理自DataCamp課程之 Intro to Python for Data Science.
本系列將包括以下內(nèi)容:
- Python 基礎(chǔ)
- Python 列表 list (本文)
- 函數(shù)、方法和包
- Numpy 入門
訪問 我的github 可下載本文對應(yīng)的notebook以及練習(xí)答案,便于親手實踐。
注意:本文代碼基于Python3版本。如果要在python2中執(zhí)行,需要先導(dǎo)入_future_模塊。
#僅在Python2中使用
#from __future__ import division
#from __future__ import print_function
1. List 數(shù)據(jù)類型
上一講中,我們提到了四種數(shù)據(jù)類型,分別是浮點型(float)、整型(int)、字符串(str)、布爾型(bool)。它們都有個共同特點,那就是這些類型的變量只能存放一個數(shù)值。如果我們想存儲一家四口人的身高數(shù)據(jù),該怎么辦呢?是不是要創(chuàng)建4個變量?如果是一個國家的數(shù)據(jù)呢?
顯然我們需要新的數(shù)據(jù)類型,一種復(fù)合的數(shù)據(jù)類型,列表(list)則很好地地解決了這一大數(shù)據(jù)量的問題。
列表可以看成是一串有序的數(shù)據(jù)集合,它可以存放任何類型的數(shù)據(jù),甚至是不同類型的數(shù)據(jù)。你可以將它想象成一列隊伍,其中有各個國家的人,甚至還要小貓和小狗。
我們將數(shù)據(jù)放入一對方括號 [ ] 內(nèi)來表示列表,數(shù)據(jù)之間用逗號相隔。以下是某個四口之家的身高數(shù)據(jù)列表:
family = [1.73, 1.68, 1.71, 1.89]
family
[1.73, 1.68, 1.71, 1.89]
使用 type() 函數(shù)檢查下它的數(shù)據(jù)類型:
type(family)
list
以上列表并不能區(qū)分是誰的身高,如何改進(jìn)呢?還記得我們說過,列表中的元素可以是不同類型的數(shù)據(jù),所以我們做如下改動。
family = ['me', 1.73, 'sister', 1.68, 'mom', 1.71, 'dad', 1.89]
family
['me', 1.73, 'sister', 1.68, 'mom', 1.71, 'dad', 1.89]
上面將字符串和實數(shù)混合在一個列表中,區(qū)分了身高。那么再想一想,有沒有更好的辦法呢?當(dāng)然是有的。
family2 = [['me', 1.73],
['sister', 1.68],
['mom', 1.71],
['dad', 1.89]]
family2
[['me', 1.73], ['sister', 1.68], ['mom', 1.71], ['dad', 1.89]]
看清了嗎?列表的元素也可以是列表,以上將每一個小列表,嵌套入一個更大的列表之中,使得數(shù)據(jù)的結(jié)構(gòu)更清晰。當(dāng)然,還有其他多種方式來表達(dá)這組數(shù)據(jù),比如字典,因為不是今天的主題就不在此處展開了。
練習(xí)2-1:
在記錄了全家的身高后,你是不是打算再記錄一下家里各個房間的面積呢。請根據(jù)下面的提示,創(chuàng)建一個房間面積的列表。
# 各房間的面積變量(單位是平方米)
hall = 11.25
kit = 18.0
liv = 20.0
bed = 10.75
bath = 9.50
# 創(chuàng)建面積列表 areas
# 打印輸出 areas
參考上文例子中的方法,創(chuàng)建一個更清晰的列表,能顯示出是哪個房間面積。
# 改進(jìn)后的列表 areas
# 打印輸出 areas
# 輸出 areas 的數(shù)據(jù)類型
2. 列表切片
切片,顧名思義,就是截取一個片段。有時我們只需要使用列表中的部分?jǐn)?shù)據(jù),可以使用切片操作來實現(xiàn)。
在講具體操作前,我們首先需要了解Python列表的索引規(guī)則。列表是有序的,我們用索引來標(biāo)記這一序列。索引既可以正著數(shù),也可以倒著數(shù),但要注意,正向索引時是從0開始計數(shù)的。

在列表中取單個元素時,我們采用 list_name[index],比如:
family[3]
1.68
family[-2]
'dad'
在列表中取連續(xù)的一串元素時,采用 list_name[start:end],但尤其要注意,end 代表的元素并不包含在結(jié)果中。
family[4:6]
['mom', 1.71]
如果從頭部開始取數(shù),或結(jié)束在尾部時,可采用省略模式。
family[:2]
['me', 1.73]
family[-2:]
['dad', 1.89]
family[:] # 表示全部
['me', 1.73, 'sister', 1.68, 'mom', 1.71, 'dad', 1.89]
當(dāng)然還可以設(shè)置特定的步長間隔。
family[1:7:2]
[1.73, 1.68, 1.71]
練習(xí)2-2:
依舊使用上一節(jié)練習(xí)中的房間面積數(shù)據(jù),讓我們來練習(xí)下切片操作。
# 創(chuàng)建 areas 列表
areas = ["hallway", 11.25, "kitchen", 18.0, "living room", 20.0, "bedroom", 10.75, "bathroom", 9.50]
# 打印輸出 areas 中第2個元素
# 打印輸出 areas 中最后一個元素
# 打印輸出 living room 的面積
讓我們用列表元素做個小計算:
# 計算廚房kitchen和臥室bedroom的總面積,并賦值給 eat_sleep_area
# 打印輸出 eat_sleep_area
想象一下這是一個兩層的迷你小別墅,樓下包括門廳hallway、廚房kitchen、客廳living room,樓上包括臥室bedroom和浴室bathroom。
# 切片將樓下的數(shù)據(jù)存入 downstairs
# 切片將樓上的數(shù)據(jù)存入 upstairs
# 打印輸出 downstairs 和 upstairs
3. 列表操作
接下來,讓我們看看如何對列表進(jìn)行修改、增加、移除等操作。
隨著時光老去,你發(fā)現(xiàn)爸爸不如以前高了,而自己似乎又長了點,于是你打算對 family 列表做下修改。
family[7] = 1.86
family[0:2] = ['taller_me', 1.78]
family
['taller_me', 1.78, 'sister', 1.68, 'mom', 1.71, 'dad', 1.86]
但是可喜的是,又添了一個兄弟,于是把他也加入 family 中。
family = family + ['brother', 0.85]
family
['taller_me', 1.78, 'sister', 1.68, 'mom', 1.71, 'dad', 1.86, 'brother', 0.85]
略感哀傷的是,姐姐嫁人了,離開了這個家庭,所以得把她從 family 中移除。
del(family[2:4])
family
['taller_me', 1.78, 'mom', 1.71, 'dad', 1.86, 'brother', 0.85]
家庭故事就到這兒結(jié)束啦,讓我們回歸到邏輯層面,請猜一猜以下代碼單元中的 x與y、x與z 之間是什么關(guān)系?
x = ['a', 'b', 'c']
y = x
print(x)
print(y)
['a', 'b', 'c']
['a', 'b', 'c']
如果改變y的值,會發(fā)生什么情況?
y[0] = 'd'
print(x)
print(y)
['d', 'b', 'c']
['d', 'b', 'c']
x的值竟然也跟著變了!我們再看:
x = ['a', 'b', 'c']
z = list(x) # 或 z = x[:]
print(x)
print(z)
['a', 'b', 'c']
['a', 'b', 'c']
我們會發(fā)現(xiàn),如果改變z的值,x并不會跟著變。
z[0] = 'e'
print(x)
print(z)
['a', 'b', 'c']
['e', 'b', 'c']
讓我們用下面這幅圖來說明背后的邏輯。Python使用對象模型來存儲數(shù)據(jù),任何類型的值都是一個對象,所有對象都具備三個特性:身份(ID)、值(value)、類型(type)。這里的列表自然也是對象,x、y、z這類列表名稱是ID,它們所指向的內(nèi)容才是value。所以當(dāng)使用 y = x 時,只是將ID進(jìn)行傳遞,它們所指向的值是同一個。但是使用 z = list(x),則是創(chuàng)建了一個新的對象z。

練習(xí)2-3:
現(xiàn)在你打算將房子改造一下,那么親手試一下吧!
# 創(chuàng)建 areas 列表
areas = ["hallway", 11.25, "kitchen", 18.0, "living room", 20.0, "bedroom", 10.75, "bathroom", 9.50]
# 將浴室bathroom的面積修改為10.5
# 將"living room" 修改為"chill zone"
print(areas)
# 創(chuàng)建一個新的列表 areas_1,在原有 areas 列表的基礎(chǔ)上,增加一個游泳池 poolhouse,面積是24.5平米
areas_1 =
# 創(chuàng)建一個新的列表 areas_2,在 areas_1 的基礎(chǔ)上,再增加一個面積為15.45平米的車庫。
areas_2 =
print(areas_2)
# 創(chuàng)建 areas_list
areas_list = [11.25, 18.0, 20.0, 10.75, 9.50]
# 創(chuàng)建新的列表 areas_copy,使它的初始值和 areas_list 相同,但在改變 areas_copy 時不能影響 areas_list 的值
areas_copy = ...
# 改變 areas_copy
areas_copy[0] = 5.0
print(areas_list)
print(areas_copy)
補(bǔ)充:
關(guān)于 我的github 中文件下載的方式:
如果下載單個文件,點擊所要下載的文件,在新打開的頁面中找到右上方的
raw按鈕,右擊另存為即可。另外文件名需要刪除后綴 .txt,而保留原始格式后綴,如 .ipynb 。如果打包下載,回到github庫的根目錄中,點擊右上方綠色的
Clone and download按鈕,選擇Download ZIP即可。
本文使用Jupyter notebook 編寫,關(guān)于它的說明和安裝方法,可以參考我之前的兩篇文章。