上一章我们学习了分支结构,并且将之前学的两种基础数据类型——数字和字符串,并且将他们结合了起来,最后还留了两个练习,练习的答案将在本章的最后给出,本章我们就来学习一下另外的两种数据类型——列表和元祖

列表

列表的英文是list。用符号[]来表示,列表与其他编程语言中的数组是一模一样的,只是叫法不一样。从它的名称我们就能看出,列表这种数据结构是用来放多个数据的。之前我们学习的数字和字符串,一个变量里面都只能有一个值。

创建列表

在Python里面用[]来表示一个列表,下面来看一个例子

# 创建一个空列表
students = []
print(students)
print(type(students))

# 创建一个空列表
students = []
print(students)
print(type(students))

输出的结果为:



javalist类型的数据能直接插入数据库呢 java往list里面添加数据_android 取出list第一页数据

从输出的结果我们可以看出来,列表的数据类型就是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], '可以无限嵌套']

我们简单分析一下层级



javalist类型的数据能直接插入数据库呢 java往list里面添加数据_android 取出list第一页数据_02

从中可以看出,虽然是可以无限嵌套,但是也不建议嵌套太多层,否则容易使人犯迷糊

往列表里面添加数据

列表不都是创建的时候赋值的,大多数时候,我们是创建一个空列表,然后往列表里面增加数据,增加数据要使用列表的一个专属方法:append()

# 创建一个空列表
books = []
# 往books里面添加一本书
books.append('简爱')
print(books)

# 再往books里面添加一本书
books.append("时间简史")
print(books)

# 创建一个空列表
books = []
# 往books里面添加一本书
books.append('简爱')
print(books)

# 再往books里面添加一本书
books.append("时间简史")
print(books)

输出结果:



javalist类型的数据能直接插入数据库呢 java往list里面添加数据_字符串_03

我们两次往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是第四个,不存在,这一点所有的编程语言都是一样的



javalist类型的数据能直接插入数据库呢 java往list里面添加数据_数据_04

正确的取数方式应该是这样的

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)

查看结果:



javalist类型的数据能直接插入数据库呢 java往list里面添加数据_元组_05

列表转元组

列表转元组用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)

执行结果:



javalist类型的数据能直接插入数据库呢 java往list里面添加数据_字符串_06

从结果里面可以看出,列表里面的列表并没有被转换,只转换了最外层的列表,因为元组本身也可以容纳列表,所以里面的列表不转换也没有关系

结语

本章我们学习了列表和元祖的基本内容,并且了解了列表和元祖的区别,现在我们已经可以在一个变量里面放入多个数据了。但是我们处理数据依旧是一个一个处理的,如果要同同时处理多个非常不方便,下一章,我们将学习循环结构,让程序去替我们完成重复的工作。

小练习

上一章答案

答案仅供参考,编程没有唯一答案,对于初学者来说能实现功能即可,下面的单仍有优化空间,可以自己尝试着修改一下

  1. 根据输入的性别选择合适的称呼
name = input("请输入姓名:")
sex = input("请输入性别:")
if sex == "男":
    print("早安," + name + "先生")
else:
    print("早安," + name + "女士")

name = input("请输入姓名:")
sex = input("请输入性别:")
if sex == "男":
    print("早安," + name + "先生")
else:
    print("早安," + name + "女士")
  1. 根据总分给出综合评价
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) + ", 给您的评价是:需要努力")

本章练习

  1. 通过控制台提示用于输入4种喜欢的水果,然后返回他输入的第二种水果
  2. 通过控制台提示用户从高到底依次输入5个分数(0-100)
  1. 输出前三名的分数,并且计算所有人的总分数
  2. 计算平均分
  3. 并且判断最后一名的分数是否超过及格线(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]

注意:必须是全部为数字类型或者英文字母才可以, 元组由于是不能被修改的,所以顺序也不能改 ,也就不能排序了