上一章我们学习了分支结构,并且将之前学的两种基础数据类型——数字和字符串,并且将他们结合了起来,最后还留了两个练习,练习的答案将在本章的最后给出,本章我们就来学习一下另外的两种数据类型——列表和元祖
列表
列表的英文是list
。用符号[]
来表示,列表与其他编程语言中的数组
是一模一样的,只是叫法不一样。从它的名称我们就能看出,列表这种数据结构是用来放多个数据的。之前我们学习的数字和字符串,一个变量里面都只能有一个值。
创建列表
在Python里面用[]
来表示一个列表,下面来看一个例子
# 创建一个空列表
students = []
print(students)
print(type(students))
# 创建一个空列表
students = []
print(students)
print(type(students))
输出的结果为:
从输出的结果我们可以看出来,列表的数据类型就是list
,空列表输出的就是一个[]
。现在我们来创建一个非空的列表,比如添加几个学生进去。
# 创建一个非空的列表
students = ['小明', '小红', '露丝']
print(students)
print(type(students))
# 创建一个非空的列表
students = ['小明', '小红', '露丝']
print(students)
print(type(students))
这个时候输出的students
就不仅仅是一个[]
了,括号内是包含了数据的。现在这个列表里面的数据是字符串,当然也可以是数字,甚至是个列表,里面的元素是没有任何限制的,比如:
something = [1, 2.5, '字符串', ['另一个列表', ['里面还有', 2, 4], 5], '可以无限嵌套']
something = [1, 2.5, '字符串', ['另一个列表', ['里面还有', 2, 4], 5], '可以无限嵌套']
我们简单分析一下层级
从中可以看出,虽然是可以无限嵌套,但是也不建议嵌套太多层,否则容易使人犯迷糊
往列表里面添加数据
列表不都是创建的时候赋值的,大多数时候,我们是创建一个空列表,然后往列表里面增加数据,增加数据要使用列表的一个专属方法:append()
# 创建一个空列表
books = []
# 往books里面添加一本书
books.append('简爱')
print(books)
# 再往books里面添加一本书
books.append("时间简史")
print(books)
# 创建一个空列表
books = []
# 往books里面添加一本书
books.append('简爱')
print(books)
# 再往books里面添加一本书
books.append("时间简史")
print(books)
输出结果:
我们两次往books
列表里面添加书名,最后books
列表里面就有了两本书了,既然是列表,那么这个列表是有长度的,我们可以查看这个列表里面究竟有几本书 。查看长度用len()
方法
books = ['简爱', '时间简史', '昆虫记', '格林童话']
# 查看books里面有几本书
print(len(books)) # 输出结果为:4
books = ['简爱', '时间简史', '昆虫记', '格林童话']
# 查看books里面有几本书
print(len(books)) # 输出结果为:4
len()
函数只能查看列表最外层的数据长度,如果列表里面还有列表,那么二层列表里面的长度是不会被统计进去的
books = ['简爱', '时间简史', '昆虫记', '格林童话', ['安徒生童话', '白雪公公主, '猫和老鼠']]
# 查看books里面有几本书
print(len(books))
# 输出结果为:5,最后的 ['安徒生童话', '白雪公主', '猫和老鼠'] 被当成是一个
books = ['简爱', '时间简史', '昆虫记', '格林童话', ['安徒生童话', '白雪公公主, '猫和老鼠']]
# 查看books里面有几本书
print(len(books))
# 输出结果为:5,最后的 ['安徒生童话', '白雪公主', '猫和老鼠'] 被当成是一个
从数组里面取数
列表里面是一连串的数据,而我们使用的时候往往只需要其中的一个或多个,这个时候我们就要将其中的取出来了。
取出单个数据
刚刚用len()
函数我们已经知道了列表里面有多少个数据,那么我们可以通过变量名[n]
的方式来获取第n个数据
# 定义学生列表
students = ['小明', '小红', '露丝']
# 取出第一个学生
name = students[1] # 在中括号里面放数字,表示要取第几个
print(name)
# 定义学生列表
students = ['小明', '小红', '露丝']
# 取出第一个学生
name = students[1] # 在中括号里面放数字,表示要取第几个
print(name)
输出的结果是小红,很奇怪是不是,第一个明明是小明。这是因为计算机是从0开始计数的,所以在中括号中放数字1,其实是第,2个,所以这里有3个数据,那么括号里面的数字最大只能为2,不能为3,因为3是第四个,不存在,这一点所有的编程语言都是一样的
正确的取数方式应该是这样的
students = ['小明', '小红', '露丝']
print(students[0]) # 取第一个:小明
print(students[1]) # 取第二个:小红
print(students[2]) # 取第三个:露丝
students = ['小明', '小红', '露丝']
print(students[0]) # 取第一个:小明
print(students[1]) # 取第二个:小红
print(students[2]) # 取第三个:露丝
其中数字0
,1
,2
被称为列表的索引,即数据在列表中的顺序位置,记住是从0
开始
取出多个数据
有时候我们希望一次能取出多个数据来,这时候就需要用到列表的分片操作了
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 取出分数高的前五名
print(score_list[0:5])
# 执行结果:[100, 98, 97, 95, 90]
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 取出分数高的前五名
print(score_list[0:5])
# 执行结果:[100, 98, 97, 95, 90]
取出一个数据,我们是在列表后面的中括号中填写要取出的数据的索引,而要取出多个数据,我们是在中括号中放了两个索引,并且中间以冒号分割,这种操作就称为切片。冒号左边的是起始索引,冒号右边的是终止索引。
上面的代码的意思就是取第0位(即第1个)到第5位(即第6个)中间的部分。需要注意的是,最后一个数值并不会被选中,虽然我们取到第6位,但是并不包含第6位,实际上就是前面5个。同时还注意到,取出来的数据还是一个列表,因为取出来的数原来列表中的一段,所以结果依然是个列表类型的数据。
如果起始位置是从0开始,那么0可以省略不写,如果终止位置是最后一位,那么终止位置也可以省略,如下:
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 取出分数高的前五名
print(score_list[:5]) # 0可以省略,但是冒号必须留着,否则就成了取单个值了
# 取分数最低的3个
print(score_list[6:])
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 取出分数高的前五名
print(score_list[:5]) # 0可以省略,但是冒号必须留着,否则就成了取单个值了
# 取分数最低的3个
print(score_list[6:])
顺着取容易,取最后几位却还是要数过去找到开始的位置非常的不方便,我们可以直接用负号来表示从倒数第几位开始取:
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 取分数最低的3个
print(score_list[-3:]) # -3代表从倒数第三个开始
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 取分数最低的3个
print(score_list[-3:]) # -3代表从倒数第三个开始
获取列表内的列表中的元素
上面的例子都只有一层,但是前面有提过,列表是可以嵌套多层的,那么如何获取列表里面的列表中的元素呢?
# 创建一个多层列表,假设有个小组列表,每个小组里面有不同数量的人
groups = [['张三', '李四', '王五'], ['小红', '小花', '小明'], ['jack', 'lucy', 'alice', 'jams']]
# 取第一组第一个人
print(groups[0][0])
# 取第二组最后一个人
print(groups[1][-1])
# 取最后一组第二和第三个人
print(groups[-1][1:3])
# 创建一个多层列表,假设有个小组列表,每个小组里面有不同数量的人
groups = [['张三', '李四', '王五'], ['小红', '小花', '小明'], ['jack', 'lucy', 'alice', 'jams']]
# 取第一组第一个人
print(groups[0][0])
# 取第二组最后一个人
print(groups[1][-1])
# 取最后一组第二和第三个人
print(groups[-1][1:3])
实际上多维素组的取值就是按层级一层一层往里面找
修改列表中的某个元素
修改某个值,我们直接通过索引找到他,然后重新赋值即可,例如:
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 修改第二个数据98为99
score_list[1] = 99
print(score_list)
# 结果为:[100, 99, 97, 95, 90, 87, 80, 79, 60]
# 创建一个手动排序好的分数列表
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 修改第二个数据98为99
score_list[1] = 99
print(score_list)
# 结果为:[100, 99, 97, 95, 90, 87, 80, 79, 60]
删除列表里面的某个元素
删除某个值,使用del
关键字
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 删除最后一个 , -1 代表倒数第一个
del score_list[-1]
print(score_list)
# 最后的结果为:[100, 98, 97, 95, 90, 87, 80, 79], 60被删除了
score_list = [100, 98, 97, 95, 90, 87, 80, 79, 60]
# 删除最后一个 , -1 代表倒数第一个
del score_list[-1]
print(score_list)
# 最后的结果为:[100, 98, 97, 95, 90, 87, 80, 79], 60被删除了
判断元素是否存在列表中
判断元素是否在列表或者元组中,使用关键字in
。结合上一章的条件判断,看下面这个例子:
if "Python" in ["Python", "Java", "C++", "Go"]:
print("Python语言在列表中")
else:
print("Python不在列表中")
if "Python" in ["Python", "Java", "C++", "Go"]:
print("Python语言在列表中")
else:
print("Python不在列表中")
元组
元组的英文是tuple
, 用符号()
来表示,元组与列表极其相似,都可以根据索引取值,切片等操作。不同的是,元组不能修改,也就是说创建好了就不能对它进行修改,不能添加新数据,也不能删除数据。所以元组一般用不允许修改的场合,例如从数据库查询出来的结果,一些类似下拉框的选择项等等
创建元组
# 创建元组
sex = ('男', '女')
print(type(sex))
# 结果为:
# 创建元组
sex = ('男', '女')
print(type(sex))
# 结果为:
创建一个元组,并查看其类型,元组的类型为tuple。同样元组里面也可以是不同数据类型的数据:
some = (1, 3.4, "字符串", ('男', '女'), [0, '列表'])
some = (1, 3.4, "字符串", ('男', '女'), [0, '列表'])
注意:由于()小括号本身在编程里面有“优先计算”的含义(还记得学习数字类型的时候四则运算吗?),所以如果元组中只有一个数据,那么程序是不会判断这是个元组的,因此如果元组内只有一个数据,那么一定要在后面加上逗号,例如:
# 正确创建元组的方式
sex = ('男', )
print(type(sex)) # 类型为:tuple
# 错误创建元组的方式,一个元素无法构成元组
sex = ('男')
print(type(sex)) # 类型为:string
# 正确创建元组的方式
sex = ('男', )
print(type(sex)) # 类型为:tuple
# 错误创建元组的方式,一个元素无法构成元组
sex = ('男')
print(type(sex)) # 类型为:string
获取数据
元组同样支持指定索引获取数据和切片操作
# 假设驾驶证的类型有以下几种切不会改变
licence = ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
# 从中选择一个驾驶证类型以
my_licence = licence[4]
print(my_licence)
# 获取前2中驾驶证类型
print(licence[:2])
# 假设驾驶证的类型有以下几种切不会改变
licence = ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
# 从中选择一个驾驶证类型以
my_licence = licence[4]
print(my_licence)
# 获取前2中驾驶证类型
print(licence[:2])
元组与列表相互转换
元组与列表不仅在结构上相似,它们之间也是可以进行相互转换的
元组转列表
元组转列表使用list()
函数
# 创建一个元组
licence = ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
# 将元组转换为列表
licence_list = list(licence)
print(type(licence_list))
print(licence_list)
# 创建一个元组
licence = ('A1', 'A2', 'B1', 'B2', 'C1', 'C2')
# 将元组转换为列表
licence_list = list(licence)
print(type(licence_list))
print(licence_list)
查看结果:
列表转元组
列表转元组用tuple()
函数
# 创建一个列表
books = ['简爱', '时间简史', '昆虫记', '格林童话', ['安徒生童话', '白雪公主', '猫和老鼠']]
# 将列表转换为元组
books_tuple = tuple(books)
print(type(books_tuple))
print(books_tuple)
# 创建一个列表
books = ['简爱', '时间简史', '昆虫记', '格林童话', ['安徒生童话', '白雪公主', '猫和老鼠']]
# 将列表转换为元组
books_tuple = tuple(books)
print(type(books_tuple))
print(books_tuple)
执行结果:
从结果里面可以看出,列表里面的列表并没有被转换,只转换了最外层的列表,因为元组本身也可以容纳列表,所以里面的列表不转换也没有关系
结语
本章我们学习了列表和元祖的基本内容,并且了解了列表和元祖的区别,现在我们已经可以在一个变量里面放入多个数据了。但是我们处理数据依旧是一个一个处理的,如果要同同时处理多个非常不方便,下一章,我们将学习循环结构,让程序去替我们完成重复的工作。
小练习
上一章答案
答案仅供参考,编程没有唯一答案,对于初学者来说能实现功能即可,下面的单仍有优化空间,可以自己尝试着修改一下
- 根据输入的性别选择合适的称呼
name = input("请输入姓名:")
sex = input("请输入性别:")
if sex == "男":
print("早安," + name + "先生")
else:
print("早安," + name + "女士")
name = input("请输入姓名:")
sex = input("请输入性别:")
if sex == "男":
print("早安," + name + "先生")
else:
print("早安," + name + "女士")
- 根据总分给出综合评价
chinese = input("请输入语文成绩:")
math = input("请输入数学成绩:")
english = input("请输入英语成绩:")
total = int(chinese) + int(math) + int(english)
if total > 240:
print("您的总分是:" + str(total) + ", 给您的评价是:优秀")
elif 180 <= total <= 240:
print("您的总分是:" + str(total) + ", 给您的评价是:一般")
else:
print("您的总分是:" + str(total) + ", 给您的评价是:需要努力")
chinese = input("请输入语文成绩:")
math = input("请输入数学成绩:")
english = input("请输入英语成绩:")
total = int(chinese) + int(math) + int(english)
if total > 240:
print("您的总分是:" + str(total) + ", 给您的评价是:优秀")
elif 180 <= total <= 240:
print("您的总分是:" + str(total) + ", 给您的评价是:一般")
else:
print("您的总分是:" + str(total) + ", 给您的评价是:需要努力")
本章练习
- 通过控制台提示用于输入4种喜欢的水果,然后返回他输入的第二种水果
- 通过控制台提示用户从高到底依次输入5个分数(0-100)
- 输出前三名的分数,并且计算所有人的总分数
- 计算平均分
- 并且判断最后一名的分数是否超过及格线(60分),如果没有超过及格分,就提示用户最后一名不及格,否则提示所有人都及格了
每日小技巧
对于全是数字的列表,可以使用列表的一个特殊方法对其进行排序
score = [90, 100, 76, 83, 92, 59]
# 排序,默认是从小到大
score.sort()
print(score) # 结果为:[59, 76, 83, 90, 92, 100]
# 倒排, 给sort()添加个参数,参数含义后面讲解函数的时候再说明
score.sort(reverse=True)
print(score) # 结果为:[100, 92, 90, 83, 76, 59]
score = [90, 100, 76, 83, 92, 59]
# 排序,默认是从小到大
score.sort()
print(score) # 结果为:[59, 76, 83, 90, 92, 100]
# 倒排, 给sort()添加个参数,参数含义后面讲解函数的时候再说明
score.sort(reverse=True)
print(score) # 结果为:[100, 92, 90, 83, 76, 59]
注意:必须是全部为数字类型或者英文字母才可以, 元组由于是不能被修改的,所以顺序也不能改 ,也就不能排序了