零基础学Python:Day7!列表:让你轻松存储一堆数据
昨天我们学习了Python里非常实用的循环语句,让程序可以自动重复干活,省去了大量重复代码。今天我们来学习Python中最常用的数据结构之一——列表(List)!有了列表,我们就可以轻松存储一堆数据,比如一个班级所有学生的成绩、一个购物车的所有商品,管理起来超级方便~老规矩,先公布昨天的作业答案。
📋 上次作业答案
1. 用for循环计算1-100之间所有偶数的和
total = 0for i in range(1, 101):if i % 2 == 0: total += iprint(f"1-100所有偶数的和是: {total}")
运行结果:
1-100所有偶数的和是: 2550
你算对了吗?也可以直接用步长来写,更简洁:
total = 0# 从2开始,步长2,直接得到所有偶数for i in range(2, 101, 2): total += iprint(f"1-100所有偶数的和是: {total}")
结果完全一样,两种写法都对哦~
2. 用while循环输出1-100之间所有能被7整除的数
i = 1while i <= 100:if i % 7 == 0:print(i) i += 1
运行输出:
714212835424956637077849198
正好是100以内所有7的倍数,正确!
3. 找出1-100之间所有的质数
质数的判断方法:大于1,除了1和它本身,不能被其他任何数整除。代码实现:
# 遍历1-100每个数for num in range(2, 101):# 假设当前数是质数,先标记为True is_prime = True# 判断能不能被2到num-1之间的数整除for i in range(2, num):if num % i == 0:# 如果能整除,说明不是质数,标记为False,跳出循环 is_prime = Falsebreak# 如果标记还是True,说明是质数,输出if is_prime:print(num, end=" ")
运行结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
一共25个质数,完全正确!这个题用到了循环嵌套,你写对了吗?
4. 给猜数字游戏加上次数限制,最多猜5次
answer = 8count = 0 # 记录猜的次数while count < 5: # 最多猜5次,次数小于5才能继续 guess = int(input("猜一个1-10之间的数字: ")) count += 1 # 猜一次,次数加1if guess > answer:print(f"你猜大了,已经猜了{count}次,还剩{5-count}次")elif guess < answer:print(f"你猜小了,已经猜了{count}次,还剩{5-count}次")else:print(f"恭喜你猜对了!一共用了{count}次,游戏结束")break# 循环结束后,如果已经猜了5次还没猜对,说明游戏失败if count == 5 and guess != answer:print(f"你已经猜了5次了,还没猜对,游戏失败!正确答案是{answer}")
运行示例:
猜一个1-10之间的数字: 1你猜小了,已经猜了1次,还剩4次猜一个1-10之间的数字: 2你猜小了,已经猜了2次,还剩3次猜一个1-10之间的数字: 3你猜小了,已经猜了3次,还剩2次猜一个1-10之间的数字: 4你猜小了,已经猜了4次,还剩1次猜一个1-10之间的数字: 5你猜小了,已经猜了5次,还剩0次你已经猜了5次了,还没猜对,游戏失败!正确答案是8
完美,符合要求,是不是越来越好玩了?
好啦,都对完答案了,我们开始今天的正题——列表,这是Python里最常用的数据结构,没有之一,赶紧学起来吧~
🤔 为什么需要列表?
之前我们学习了变量,一个变量只能存一个数据,比如:
name = "小明"age = 18score = 95
但是如果我们要存储一个班级50个学生的名字,难道要定义50个变量吗?name1、name2...name50?这也太麻烦了,管理起来也超级不方便。
有了列表,我们就可以把一堆数据放在一个变量里,管理起来超级简单:
names = ["小明", "小红", "小刚", "小丽", "小强"] # 一个列表存5个学生名字scores = [95, 88, 76, 91, 85] # 一个列表存5个学生成绩
你看,只需要一个变量,就存了一堆数据,是不是非常方便?
简单来说,列表就是Python里用来存储一组有序数据的容器,可以放任意类型的数据,你甚至可以在列表里放另一个列表(嵌套列表),非常灵活。
列表基础:怎么定义列表?
定义列表非常简单,用方括号[]把数据括起来,多个数据之间用逗号,隔开就行了,语法就是这么简单:
# 空列表,里面什么数据都没有empty_list = []# 存一组数字numbers = [1, 3, 5, 7, 9]# 存一组字符串fruits = ["苹果", "香蕉", "橙子", "草莓"]# 混合存不同类型的数据,Python允许哦!mixed = ["小明", 18, 95.5, True]
你看,定义列表是不是超级简单?Python真的非常灵活,同一个列表里可以放不同类型的数据,这一点和很多其他编程语言不一样哦~
怎么从列表里取数据?索引!
定义好了列表,我们肯定要从里面取出我们想要的数据呀,怎么取呢?用索引!
列表里每个数据都有自己的编号,这个编号就是索引,Python里的索引是从0开始数的,第一个元素索引是0,第二个是1,以此类推...
语法:列表名[索引]
举个例子:
fruits = ["苹果", "香蕉", "橙子", "草莓"]# 取第一个元素,索引是0print(fruits[0]) # 输出: 苹果# 取第二个元素,索引是1print(fruits[1]) # 输出: 香蕉# 取第四个元素,索引是3print(fruits[3]) # 输出: 草莓
这里一定要记住:索引从0开始,很多新手刚学的时候都会记错,把第一个元素的索引写成1,结果就报错了,一定要注意哦~
负索引:从后面往前数
Python还支持负索引,就是从列表最后开始往前数,[-1]就是最后一个元素,[-2]就是倒数第二个,以此类推,超级方便!
举个例子:
fruits = ["苹果", "香蕉", "橙子", "草莓"]# 最后一个元素print(fruits[-1]) # 输出: 草莓# 倒数第二个元素print(fruits[-2]) # 输出: 橙子# 倒数第四个元素,就是第一个print(fruits[-4]) # 输出: 苹果
是不是太人性化了?想拿最后一个元素都不用数列表长度了,直接[-1]就拿到了,太方便了!
越界错误
如果你写的索引超出了列表的范围,Python就会报错,比如下面这个例子:
fruits = ["苹果", "香蕉", "橙子", "草莓"]print(fruits[4])
这个列表只有4个元素,索引最大是3(或者-4),你写4就越界了,会报这个错:
IndexError: list index out of range
看到这个错误,你就知道是索引写错了,超出范围了,检查一下就好了~
切片:一次性取多个元素
如果你想一次性从列表里取出一段元素,就可以用切片,语法超级简单: 列表名[start:end:step]
同样,切片也是左闭右开,包含start位置的元素,不包含end位置的元素,我们来举几个例子:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 取索引从1到5的元素(包含1,不包含5,所以结果是索引1,2,3,4)print(numbers[1:5]) # 输出: [1, 2, 3, 4]# 从开头取到索引5,不包含5,开头可以省略不写print(numbers[:5]) # 输出: [0, 1, 2, 3, 4]# 从索引3开始取到结尾,结尾可以省略不写print(numbers[3:]) # 输出: [3, 4, 5, 6, 7, 8, 9]# 整个列表切片,开头结尾都省略print(numbers[:]) # 输出整个列表: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 还可以指定步长,隔一个取一个,步长是2print(numbers[::2]) # 输出: [0, 2, 4, 6, 8]# 负步长,可以倒序取元素print(numbers[::-1]) # 输出倒序的整个列表: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
切片真的太好用了,一次性取一段元素,几秒钟搞定,而且切片不会报错哦,就算你写的start或者end超出范围,Python也不会报错,会尽可能给你返回能取到的元素,非常人性化。
怎么修改列表?增删改查都搞定!
列表是可变的,也就是我们可以随时给列表添加元素、删除元素、修改元素,非常灵活,我们一个个来看。
1. 修改元素:直接索引赋值就好了
修改元素超级简单,直接通过索引找到元素,重新赋值就行:
fruits = ["苹果", "香蕉", "橙子", "草莓"]print("修改前:", fruits) # 修改前: ['苹果', '香蕉', '橙子', '草莓']# 把第二个元素(索引1)改成"葡萄"fruits[1] = "葡萄"print("修改后:", fruits) # 修改后: ['苹果', '葡萄', '橙子', '草莓']
直接就改好了,是不是超级简单?
2. 添加元素:append()、insert()
添加元素最常用的就是append(),它会把新元素添加到列表的末尾:
fruits = ["苹果", "香蕉", "橙子"]fruits.append("草莓")print(fruits) # 输出: ['苹果', '香蕉', '橙子', '草莓']
想往末尾加东西,直接用append(),这是最常用的添加方法。
如果你想把新元素插入到列表的指定位置,就用insert(),第一个参数是索引位置,第二个是要插入的元素:
fruits = ["苹果", "香蕉", "橙子"]# 在索引1的位置插入"葡萄",原来索引1及后面的元素都往后挪一位fruits.insert(1, "葡萄")print(fruits) # 输出: ['苹果', '葡萄', '香蕉', '橙子']
3. 删除元素:pop()、remove()、del
删除元素也有几种常用方法:
pop():删除指定位置的元素,默认删除最后一个,并且会把删除的元素返回给你(如果你需要用的话):
fruits = ["苹果", "香蕉", "橙子", "草莓"]# 删除最后一个元素last = fruits.pop()print("删除的元素:", last) # 删除的元素: 草莓print("删除后列表:", fruits) # 删除后列表: ['苹果', '香蕉', '橙子']# 删除索引1位置的元素fruits.pop(1)print(fruits) # 输出: ['苹果', '橙子']
remove():根据值删除,直接删除第一个匹配到的指定值:
fruits = ["苹果", "香蕉", "橙子", "香蕉"]# 删除第一个值为"香蕉"的元素fruits.remove("香蕉")print(fruits) # 输出: ['苹果', '橙子', '香蕉']
如果你知道要删除的元素具体值是什么,用remove()就非常方便。
del:这是Python关键字,可以删除指定索引或者整个切片:
fruits = ["苹果", "香蕉", "橙子", "草莓"]# 删除索引1的元素del fruits[1]print(fruits) # 输出: ['苹果', '橙子', '草莓']# 删除一段切片,索引1到3(不包含3)del fruits[1:3]print(fruits) # 输出: ['苹果']
4. 查找元素:index()看元素在哪个位置
如果你想知道某个值在列表的哪个位置,就用index(),它会返回第一个匹配到的元素的索引:
fruits = ["苹果", "香蕉", "橙子", "草莓"]print(fruits.index("橙子")) # 输出: 2
如果找不到这个值,就会报错,所以用之前要确保元素在列表里哦~
5. 统计元素出现次数:count()
如果你想知道某个元素在列表里出现了几次,就用count():
numbers = [1, 2, 3, 2, 4, 2, 5]print(numbers.count(2)) # 输出: 3,2一共出现了3次
常用操作:列表长度、排序、反转
我们再来介绍几个列表最常用的操作,实际开发中经常用到:
1. 求列表长度:len()函数
想知道一个列表里有多少个元素,用内置函数len()就好了:
fruits = ["苹果", "香蕉", "橙子", "草莓"]print(len(fruits)) # 输出: 4,一共4个元素
len()是Python内置函数,不光列表,很多其他容器也能用,非常方便。
2. 排序:sort()方法
如果你想把列表里的元素排序,直接用sort()方法就好了,默认升序:
numbers = [3, 1, 4, 1, 5, 9, 2, 6]numbers.sort() # 默认升序排序,直接修改原列表print(numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
如果想要降序排序,加上reverse=True:
numbers = [3, 1, 4, 1, 5, 9, 2, 6]numbers.sort(reverse=True) # 降序排序print(numbers) # 输出: [9, 6, 5, 4, 3, 2, 1, 1]
3. 反转列表:reverse()方法
想把整个列表倒过来,直接用reverse()方法:
numbers = [1, 2, 3, 4, 5]numbers.reverse()print(numbers) # 输出: [5, 4, 3, 2, 1]
遍历列表:用for循环依次取出每个元素
我们学会了定义列表,那怎么依次处理列表里每个元素呢?最常用的就是用for循环遍历:
fruits = ["苹果", "香蕉", "橙子", "草莓"]for fruit in fruits:print(f"我喜欢吃{fruit}")
运行结果:
我喜欢吃苹果我喜欢吃香蕉我喜欢吃橙子我喜欢吃草莓
是不是超级简单?直接for 元素 in 列表:就可以了,依次取出每个元素,然后处理,实际开发中这是最常用的写法。
如果你还需要同时拿到索引,那可以用内置函数enumerate():
fruits = ["苹果", "香蕉", "橙子", "草莓"]for index, fruit in enumerate(fruits):print(f"索引{index}对应的水果是{fruit}")
运行结果:
索引0对应的水果是苹果索引1对应的水果是香蕉索引2对应的水果是橙子索引3对应的水果是草莓
同时拿到索引和元素,是不是很方便?需要的时候用这个写法就好了。
列表嵌套:二维列表,存储表格数据
列表里还可以再放列表,这就是嵌套列表,最常用的场景就是存储表格(二维)数据,比如一个班级有三个学生,每个学生有三科成绩,我们就可以用嵌套列表存储:
# 三个学生,每个学生是[姓名, 语文, 数学, 英语]class_scores = [ ["小明", 90, 85, 95], ["小红", 95, 92, 88], ["小刚", 80, 88, 90]]# 怎么取数据呢?第一个索引取行,第二个索引取列# 取出小红的数学成绩:小红是第二行,索引1,数学是第三列,索引2print(class_scores[1][2]) # 输出: 92
完美,直接就取出来了,嵌套列表也很好理解,一层一层索引就好了。遍历嵌套列表用两层循环就行,第一层遍历行,第二层遍历列:
# 遍历输出所有学生所有成绩for student in class_scores:for item in student:print(item, end="\t")print()
运行结果:
小明 90 85 95小红 95 92 88小刚 80 88 90
非常工整,就像表格一样。
⚠️ 新手容易踩的坑
总结几个新手学习列表最容易犯的错:
- 记错索引,索引从0开始:第一个元素索引是0,不是1,这个一定要记牢,很多新手第一错就是这里
- 索引越界:索引超过了列表最大索引,导致
IndexError,取元素之前先看看列表长度,或者用负索引更安全 remove()只删除第一个匹配的元素:如果列表里有多个重复元素,remove()只会删掉第一个,想删全部需要循环处理- 切片是左闭右开:记住包含左边不包含右边,
[1:5]就是取索引1、2、3、4,不包含5,别搞错了 - 忘了列表是可变类型:比如
sort()、reverse()都是直接修改原列表,不会返回新列表,别写错成new_list = old_list.sort(),这样new_list会是None哦!
📝 今日小结
今天我们学习了Python中最常用的数据结构——列表,总结一下重点:
- 列表用来存储一组有序数据,用
[]定义,元素之间用逗号隔开,可以存任意类型 - 索引从0开始,支持负索引,
[-1]直接拿到最后一个元素,非常方便 - 切片可以一次性取出多个元素,
[start:end:step],左闭右开,非常灵活 - 列表支持增删改查:
append()加末尾,insert()插指定位置,pop()删指定位置,remove()按值删除,index()查找位置 len()可以快速得到列表长度,sort()排序,reverse()反转,常用操作要记住- 用for循环遍历列表,
enumerate()可以同时拿到索引和元素
👉 今日作业:
- 定义一个列表,存储你最喜欢的5部电影,然后:输出第二部电影,输出倒数第一部电影,添加一部新电影到末尾,删除第三部电影,最后遍历整个列表输出所有电影
- 有一个列表
numbers = [12, 34, 5, 43, 27, 8, 19, 46],计算列表中所有数字的和与平均值,输出结果 - 有一个列表
names = ["小明", "小红", "小刚", "小丽", "小明", "小强", "小红"],去除列表中重复的名字,得到一个没有重复名字的新列表 - 用嵌套列表实现一个九九乘法表,把每一行的结果存储到一个列表里,最后整个九九乘法表就是一个嵌套列表,然后遍历输出
今天我们学习了列表,明天我们继续学习另一个非常常用的数据结构——字典,让你可以用键值对存储数据,更加方便地管理结构化数据,记得来打卡学习呀~
如果觉得这个零基础Python教程对你有用,欢迎点赞关注哦~