Python數(shù)據(jù)分析的起手式(2)Python 列表 list

本文內(nèi)容整理自DataCamp課程之 Intro to Python for Data Science.

本系列將包括以下內(nèi)容:

訪問 我的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)于它的說明和安裝方法,可以參考我之前的兩篇文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容