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

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

本系列将包括以下内容:

  • Python 基础
  • Python 列表 list (本文)
  • 函数、方法和包
  • Numpy 入门

访问 我的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开始计数的。

Python数据分析的起手式(2)Python 列表 list_第1张图片
索引

在列表中取单个元素时,我们采用 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。

Python数据分析的起手式(2)Python 列表 list_第2张图片
列表

练习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 编写,关于它的说明和安装方法,可以参考我之前的两篇文章。

  • 左手程序员,右手作家:你必须会的Jupyter Notebook

  • 致Python初学者们 - Anaconda入门使用指南

你可能感兴趣的:(Python数据分析的起手式(2)Python 列表 list)