购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 Python内置数据结构

1.2.5节使用了变量存储同学cathy的个人信息,但是如果她的个人信息很多,就需要定义更多的变量来存储,这就会产生以下问题:

·变量定义多,容易混淆。

·数据各自独立,没有关联性。

·代码量大。

·可读性不强。

使用Python容器就可以解决上述问题。容器可以用来盛放一组相关联的数据,并对数据进行统一的功能操作。容器主要分为列表(list)、字典(dict)和元组(tuple),这些结构和其他语言中的类似结构本质上是相同的,但Python容器更简单、更强大。

1.3.1 列表

列表是一组元素的集合,可以实现元素的添加、删除、修改和查找等操作。现将同学cathy的个人信息统一放到列表中,代码如下:


cathy = ["cathy",10,138.5,True,None]    #cathy的个人信息 
score = [90,100,98,95]                  #各科成绩
name = list("cathy")                    #利用list()函数初始化一个列表
print(name)                             #输出结果:['c', 'a', 't', 'h', 'y']

【重点说明】

·列表内的元素用方括号([ ])包裹。

·列表内不同元素之间使用逗号(,)分隔。

·列表内可以包含任何数据类型,也可以包含另一个列表。

·可以使用list()函数生成一个列表。

可以使用列表自带的方法实现列表的访问、增加、删除和倒序等操作。仔细阅读以下代码及注释。


cathy = ["cathy",10,138.5,True,None]    #cathy的个人信息
a = cathy[0]            #下标法获取第1个元素(姓名):cathy
b = cathy[1:3]                  #使用切片获取下标1到下标3之前的子序列:[10, 138.5]
c = cathy[1:-2]                 #切片下标也可以倒着数,-1对应最后一个元素:[10, 138.5]
d = cathy[:3]                   #获取从开始到下标3之前的子序列:['cathy', 10, 138.5]
e = cathy[2:]                   #获取下标2开始到结尾的子序列:[138.5, True, None]
cathy[2] = 140.2                #将第3个元素修改为140.2
10 in cathy             #判断10是否在列表中,True
cathy.append(28)        #将体重添加到列表末尾
print(cathy)                    #['cathy', 10, 140.2, True, None, 28]
cathy.insert(2,"中国")    #将国籍插入到第2个元素之后
print(cathy)                    #['cathy', 10, '中国', 140.2, True, None, 28]
cathy.pop()             #默认删除最后一个元素
print(cathy)                    #['cathy', 10, '中国', 140.2, True, None]
cathy.remove(10)        #删除第1个符合条件的元素
print(cathy)                    #['cathy', '中国', 140.2, True, None]
cathy.reverse()                 #倒序
print(cathy)                    #[None, True, 140.2, '中国', 'cathy']

现在要使用列表存储另一个同学terry的信息,已知除了姓名以外,其他的信息跟cathy一样。通过以下操作就可以得到同学terry的列表。


#cathy的个人信息
cathy_list = ["cathy",10,138.5,True,None]
terry_list = cathy_list #将cathy_list赋给变量terry_list
terry_list[0] = "terry" #修改terry的姓名
print(terry_list)               #打印terry信息:['terry', 10, 138.5, True, None]
print(cathy_list)               #打印cathy信息:['terry', 10, 138.5, True, None]

和大家的预期不同的是,cathy_list中的姓名也变成terry了,但是我们并未修改cathy_list的姓名,这是什么原因呢?原来在执行terry_list=cathy_list时,程序并不会将cathy_list的值复制一遍,然后赋给terry_list,而是简单地为cathy_list的值即["cathy",10,138.5,True,None]建立了一个引用,相当于cathy_list和terry_list都是指向同一个值的指针,所以当terry_list中的值改变后,cathy_list的值也会跟着变。可以通过id()函数来获取变量的地址。实现代码如下:


print(id(cathy_list))                           #获取cathy_list的地址:2011809417032
print(id(terry_list))                                   #获取terry_list的地址:2011809417032

结果显示,cathy_list和terry_list这两个变量均指向同一个地址。如何解决这个问题呢?可以使用copy()函数将值复制一份,再赋给terry_list,实现代码如下:


#terry_list = cathy_list                      #删除该条语句
terry_list = cathy_list.copy()          #将值复制一份赋给变量terry_list

1.3.2 字典

将同学cathy各科的成绩保存于列表score中,实现代码如下:


score = [90,100,98,95]                          #成绩

如果想要获取cathy的语文成绩,如何做到呢?除非事先将每门课的位置都做了记录,否则无论如何是获取不到语文成绩的。当需要对数据做明确的标注,以供别人理解和处理时,使用列表就不太方便了,这时字典就派上用场了。

字典是一种非常常见的“键-值”(key-value)映射结构,它为每一个元素分配了一个唯一的key,你无须关心位置,通过key就可以获取对应的值。下面来看一下使用字典保存的成绩:


score1 = {"math":90,"chinese":100,"english":98,"PE":95}         #成绩字典
print(score1["chinese"])

【重点说明】

·字典内的元素用大括号({})包裹。

·使用key:value的形式存储一个元素,如"math":90,字符串math是分数90的key。

·字典内不同键值对之间采用逗号(,)分隔。

·字典是无序的,字典中的元素是通过key来访问的,如score1["chinese"]得到语文成绩。

也可以使用dict()函数初始化字典,实现代码如下:


score2 = dict(math=90,chinese=100,english=98,PE=95)
print(score1["chinese"])                        #根据key获取语文成绩:100
if "PE" in score1:                              #判断字典中是否包含"PE"的key
  print(score1["PE"])                           #得到体育成绩:95
#获取所有的key并保存于列表中,输出结果:['math', 'chinese', 'english', 'PE']
print(score1.keys())
#获取所有的value并保存于列表中,输出结果:[90, 100, 98, 95]
print(score1.values())
#获取key和value对转化为列表
#输出结果:[('math', 90), ('chinese', 100), ('english', 98), ('PE', 95)]
print(score1.items())

1.3.3 元组

元组和列表最大的区别就是不可变的特性,即元组的值一旦确定了,就无法进行任何改动,包括修改、新增和删除。


sex1 = ("male","female")                        #使用括号生成并初始化元组
sex2 = tuple(["male","female"])                 #从列表初始化
sex3 = ("male",)                                        #只有一个元素时,后面也要加逗号
sex4 = "male","female"                                  #默认是元组类型("male","female")

【重点说明】

·元组中元素的访问方法和列表一样,都可以使用下标和切片。

·圆括号(( ))表示元组,方括号([ ])代表列表,大括号({ })代表字典。

·初始化只包含一个元素的元组时,也必须在元素后加上逗号,如sex3。

·直接用逗号分隔多个元素的赋值默认是元组,如变量sex4。

·元组内的数据一旦被初始化,就不能更改。

1.3.4 遍历对象集合

for循环用于遍历一个对象集合,依次访问集合中的每个项目。前面提到的列表、字典和元组,均可通过for循环遍历。下面来看几个例子。

1.遍历列表


cathy = ["cathy",10,138.5,True,None]
#依次输出:"cathy",10,138.5,True,None
for a in cathy:
  print(a)

可以通过下标遍历列表。用len()函数获得列表长度,再用range()函数获得所有下标的集合,实现代码如下:


#依次输出:"cathy",10,138.5,True,None
for i in range(len(cathy)):
  print(cathy[i])

2.遍历字典


score = {"math":90,"chinese":100,"english":98,"PE":95}          #成绩字典
#键的遍历,不按顺序输出:"math","chinese","english","PE"
for key in score:
  print(key)
#键和值的遍历,不按顺序输出:math : 90,chinese : 100,english : 98,PE : 95
for key,value in score.items():
  print(key,":",value)

程序如果执行多次,会发现输出的顺序不一定一致,这是因为字典是无序的。

3.遍历元组 YEHE9trD1o/PKC7eZRYTPx6soucAX5olipzIKx6pd2iZNDzev+dMxXfKovGrcg85


sex = ("male","female")
#依次输出:"male","female"
for b in sex:
  print(b)

点击中间区域
呼出菜单
上一章
目录
下一章
×