Python数据分析的起手式(2)Python 列表 list

本文内容整理自DataCamp课程之 Intro to Python for Data Science.

本系列将包括以下内容:

访问 我的github 可下载本文对应的notebook以及练习答案,便于亲手实践。


注意:本文代码基于Python3版本。如果要在python2中执行,需要先导入_future_模块。

#仅在Python2中使用
#from __future__ import division
#from __future__ import print_function

1. List 数据类型

上一讲中,我们提到了四种数据类型,分别是浮点型(float)、整型(int)、字符串(str)、布尔型(bool)。它们都有个共同特点,那就是这些类型的变量只能存放一个数值。如果我们想存储一家四口人的身高数据,该怎么办呢?是不是要创建4个变量?如果是一个国家的数据呢?

显然我们需要新的数据类型,一种复合的数据类型,列表(list)则很好地地解决了这一大数据量的问题。

列表可以看成是一串有序的数据集合,它可以存放任何类型的数据,甚至是不同类型的数据。你可以将它想象成一列队伍,其中有各个国家的人,甚至还要小猫和小狗。

我们将数据放入一对方括号 [ ] 内来表示列表,数据之间用逗号相隔。以下是某个四口之家的身高数据列表:

family = [1.73, 1.68, 1.71, 1.89]
family

[1.73, 1.68, 1.71, 1.89]

使用 type() 函数检查下它的数据类型:

type(family)

list

以上列表并不能区分是谁的身高,如何改进呢?还记得我们说过,列表中的元素可以是不同类型的数据,所以我们做如下改动。

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]

上面将字符串和实数混合在一个列表中,区分了身高。那么再想一想,有没有更好的办法呢?当然是有的。

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]]

看清了吗?列表的元素也可以是列表,以上将每一个小列表,嵌套入一个更大的列表之中,使得数据的结构更清晰。当然,还有其他多种方式来表达这组数据,比如字典,因为不是今天的主题就不在此处展开了。

练习2-1:

在记录了全家的身高后,你是不是打算再记录一下家里各个房间的面积呢。请根据下面的提示,创建一个房间面积的列表。

# 各房间的面积变量(单位是平方米)
hall = 11.25
kit = 18.0
liv = 20.0
bed = 10.75
bath = 9.50

# 创建面积列表 areas


# 打印输出 areas

参考上文例子中的方法,创建一个更清晰的列表,能显示出是哪个房间面积。

# 改进后的列表 areas

# 打印输出 areas

# 输出 areas 的数据类型

2. 列表切片

切片,顾名思义,就是截取一个片段。有时我们只需要使用列表中的部分数据,可以使用切片操作来实现。

在讲具体操作前,我们首先需要了解Python列表的索引规则。列表是有序的,我们用索引来标记这一序列。索引既可以正着数,也可以倒着数,但要注意,正向索引时是从0开始计数的。

索引

在列表中取单个元素时,我们采用 list_name[index],比如:

family[3]

1.68

family[-2]

'dad'

在列表中取连续的一串元素时,采用 list_name[start:end],但尤其要注意,end 代表的元素并不包含在结果中。

family[4:6]

['mom', 1.71]

如果从头部开始取数,或结束在尾部时,可采用省略模式。

family[:2]

['me', 1.73]

family[-2:]

['dad', 1.89]

family[:] # 表示全部

['me', 1.73, 'sister', 1.68, 'mom', 1.71, 'dad', 1.89]

当然还可以设置特定的步长间隔。

family[1:7:2]

[1.73, 1.68, 1.71]

练习2-2:

依旧使用上一节练习中的房间面积数据,让我们来练习下切片操作。

# 创建 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。

# 切片将楼下的数据存入 downstairs

# 切片将楼上的数据存入 upstairs

# 打印输出 downstairs 和 upstairs

3. 列表操作

接下来,让我们看看如何对列表进行修改、增加、移除等操作。

随着时光老去,你发现爸爸不如以前高了,而自己似乎又长了点,于是你打算对 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]

家庭故事就到这儿结束啦,让我们回归到逻辑层面,请猜一猜以下代码单元中的 x与y、x与z 之间是什么关系?

x = ['a', 'b', 'c']
y = x
print(x)
print(y)

['a', 'b', 'c']
['a', 'b', 'c']

如果改变y的值,会发生什么情况?

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']

我们会发现,如果改变z的值,x并不会跟着变。

z[0] = 'e'
print(x)
print(z)

['a', 'b', 'c']
['e', 'b', 'c']

让我们用下面这幅图来说明背后的逻辑。Python使用对象模型来存储数据,任何类型的值都是一个对象,所有对象都具备三个特性:身份(ID)、值(value)、类型(type)。这里的列表自然也是对象,x、y、z这类列表名称是ID,它们所指向的内容才是value。所以当使用 y = x 时,只是将ID进行传递,它们所指向的值是同一个。但是使用 z = list(x),则是创建了一个新的对象z。

列表

练习2-3:

现在你打算将房子改造一下,那么亲手试一下吧!

# 创建 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)
# 创建一个新的列表 areas_1,在原有 areas 列表的基础上,增加一个游泳池 poolhouse,面积是24.5平米
areas_1 = 

# 创建一个新的列表 areas_2,在 areas_1 的基础上,再增加一个面积为15.45平米的车库。
areas_2 = 

print(areas_2)
# 创建 areas_list
areas_list = [11.25, 18.0, 20.0, 10.75, 9.50]

# 创建新的列表 areas_copy,使它的初始值和 areas_list 相同,但在改变 areas_copy 时不能影响 areas_list 的值
areas_copy = ...

# 改变 areas_copy
areas_copy[0] = 5.0

print(areas_list)
print(areas_copy)

补充:

关于 我的github 中文件下载的方式:

  • 如果下载单个文件,点击所要下载的文件,在新打开的页面中找到右上方的 raw 按钮,右击另存为即可。另外文件名需要删除后缀 .txt,而保留原始格式后缀,如 .ipynb 。

  • 如果打包下载,回到github库的根目录中,点击右上方绿色的 Clone and download 按钮,选择 Download ZIP 即可。

本文使用Jupyter notebook 编写,关于它的说明和安装方法,可以参考我之前的两篇文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容