CC++ & Algorithm

Python列表的遍历与操作

困难4
语言版本:C++Python
概述:像排队点名一样,用循环把列表里的每个元素都照顾到。

列表的遍历与操作:像整理书包一样管理数据

你有没有过这样的经历:新学期发了一大堆新书,你需要一本一本放进书包,或者偶尔要把某本旧书拿出来?在Python里,列表就像你的书包,里面可以装很多数据(数字、文字、甚至其他列表)。而遍历就是把书包里的东西一个一个拿出来看看,操作则是对里面的东西进行添加、删除、排序等整理工作。

下面我们一步步学习如何用Python让列表数据听你的话。


1. 遍历列表:挨个点名,一个不落

当列表里有多个元素时,我们常常需要“从头到尾”访问每个元素,这叫遍历。就像老师上课点名:念到谁,谁就站起来。Python里最常用的遍历工具是 for 循环。

比如你有一份水果列表,想给每种水果都加一句“今天吃:”:

fruits = ["苹果", "香蕉", "橘子", "葡萄"]   # 一个水果列表
for fruit in fruits:                        # fruit依次等于每个水果
    print("今天吃:", fruit)                 # 打印出来

运行结果:

今天吃: 苹果
今天吃: 香蕉
今天吃: 橘子
今天吃: 葡萄

怎么理解这个循环?
for fruit in fruits 可以读作“对于列表 fruits 里的每一个元素,把它暂存在变量 fruit 中,然后执行下面的操作”。循环会自动从头到尾取一遍,直到最后一个元素。

生活中的例子
你有一包零食(列表 = ["薯片", "巧克力", "饼干"]),你要把每种零食吃一口(遍历),就可以写:

snacks = ["薯片", "巧克力", "饼干"]
for snack in snacks:
    print("我吃了一块", snack)

输出:

我吃了一块 薯片
我吃了一块 巧克力
我吃了一块 饼干

小提示:如果同时需要知道当前是第几个元素(索引),可以用 enumerate

fruits = ["苹果", "香蕉", "橘子"]
for index, fruit in enumerate(fruits):
    print("第", index+1, "个水果是", fruit)

2. 添加元素:书包里再加一本书

(1)加在末尾:append()
像排队时新人站到队伍最后面一样,append() 可以把新元素添加到列表的末尾。

fruits = ["苹果", "香蕉", "橘子"]          # 原来的列表
fruits.append("西瓜")                       # 把“西瓜”添加到末尾
print(fruits)                              # 输出:['苹果', '香蕉', '橘子', '西瓜']

(2)插到中间:insert()
如果想插队到某个位置,用 insert(位置, 元素)。位置从0开始计数(0表示第一个)。

fruits.insert(1, "草莓")                   # 在索引1(第二个位置)插入“草莓”
print(fruits)                              # 输出:['苹果', '草莓', '香蕉', '橘子', '西瓜']

生活中的例子
你有一张购物清单 = ["牛奶", "面包"],后来想起还要买鸡蛋(加到末尾),以及妈妈让你在牛奶后面加上酸奶(插入位置1)。

shopping_list = ["牛奶", "面包"]
shopping_list.append("鸡蛋")
shopping_list.insert(1, "酸奶")
print(shopping_list)  # ['牛奶', '酸奶', '面包', '鸡蛋']

3. 删除元素:把不用的丢掉

(1)按内容删除:remove()
如果你知道要删掉的具体内容(比如“香蕉”),用 remove():它会删掉第一次出现的该元素。

fruits = ["苹果", "香蕉", "橘子", "香蕉"]   # 有两个“香蕉”
fruits.remove("香蕉")                        # 删除第一个“香蕉”
print(fruits)                               # 输出:['苹果', '橘子', '香蕉']

注意:如果列表里没有这个元素,程序会报错。所以删除前最好先判断一下。

(2)按位置删除:pop()
如果你知道想删掉第几个元素(比如第0个),用 pop(索引)。不写索引时默认删除最后一个。

fruits = ["苹果", "香蕉", "橘子"]
removed_item = fruits.pop(1)                # 删除索引1(第二个)的“香蕉”,并且可以拿到它
print(fruits)                               # 输出:['苹果', '橘子']
print("被删除的是:", removed_item)           # 输出:被删除的是: 香蕉

(3)清空列表:clear()
想一次性清空所有内容,用 fruits.clear()

生活中的例子
你有一堆零花钱硬币放在存钱罐里(列表 = [1, 5, 1, 10]),你花掉了第一个1元硬币(用 pop(0)),又发现5元硬币是假币(用 remove(5))。


4. 排序:按大小整理好

(1)原地排序:sort()
直接修改原列表,默认从小到大(数字)或按字母顺序(字符串)。

scores = [88, 72, 95, 60]          # 考试成绩
scores.sort()                       # 从小到大排序
print(scores)                       # 输出:[60, 72, 88, 95]

如果想从大到小,加个参数 reverse=True

scores.sort(reverse=True)           # 从大到小
print(scores)                       # 输出:[95, 88, 72, 60]

(2)不改变原列表:sorted()
有时你需要保留原来的顺序,只想要一份排好序的新列表,用 sorted()

numbers = [5, 2, 8, 1, 9]
sorted_numbers = sorted(numbers)    # 得到新列表,原列表不变
print(numbers)                      # 输出:[5, 2, 8, 1, 9]
print(sorted_numbers)               # 输出:[1, 2, 5, 8, 9]

生活中的例子
老师在登记班级身高(列表 = [150, 162, 148, 155]),排座位时想按从矮到高排列(sort()),但原始点名册不想变(用 sorted() 得到新列表用于排座位)。


5. 其他常用操作

  • 获取长度len(列表) 告诉你列表里有多少个元素。

    fruits = ["苹果", "香蕉", "橘子"]
    print(len(fruits))   # 输出 3
    
  • 判断是否包含元素 in 列表 返回 TrueFalse

    if "香蕉" in fruits:
        print("有香蕉!")
    
  • 复制列表:不要直接写 new_list = old_list,那样只是起了个别名。要用 new_list = old_list.copy()new_list = old_list[:]


6. 新手常犯的错误

  1. 在遍历列表时删除元素
    比如边遍历边 remove,会导致漏掉元素或索引错乱。正确做法是:先记下要删的,遍历完再删,或者用列表推导式。

    # 错误示例:代码没有按预期删除所有“香蕉”
    fruits = ["苹果", "香蕉", "橘子", "香蕉"]
    for fruit in fruits:
        if fruit == "香蕉":
            fruits.remove("香蕉")   # 容易出问题
    
  2. 忘记索引从0开始
    fruits[0] 是第一个元素,fruits[1] 是第二个。初学者常以为第一个的索引是1。

  3. remove() 只删除第一个匹配项
    如果列表有多个相同的值,remove 只删第一个。想删全部要用循环或列表推导式。

  4. sort()sorted() 混淆
    sort() 会改变原列表,sorted() 返回新列表。如果不想丢失原数据,用 sorted()


7. 完整示例:管理你的零食清单

下面这个程序模拟了一个零食库存管理,包含添加、删除、排序和遍历功能。

# 初始零食列表
snacks = ["薯片", "巧克力", "饼干", "牛奶糖"]   # 零食清单

# 遍历显示所有零食
print("---- 当前零食列表 ----")
for snack in snacks:
    print("- " + snack)

# 添加新零食
snacks.append("果冻")                           # 在末尾加果冻
snacks.insert(2, "棉花糖")                      # 在第三个位置插入棉花糖
print("\n添加后:", snacks)

# 删除一个零食(按内容)
if "巧克力" in snacks:                         # 先判断防止报错
    snacks.remove("巧克力")                     # 删除巧克力
print("删除巧克力后:", snacks)

# 按长度排序(从短到长)
snacks.sort(key=len)                           # 按名字长度排序
print("按名字长度排序:", snacks)

# 输出最终列表和总数
print("\n最终一共有", len(snacks), "种零食。")
print("最后一种零食是:", snacks[-1])           # 访问最后一个元素

运行结果类似:

---- 当前零食列表 ----
- 薯片
- 巧克力
- 饼干
- 牛奶糖

添加后: ['薯片', '巧克力', '棉花糖', '饼干', '牛奶糖', '果冻']
删除巧克力后: ['薯片', '棉花糖', '饼干', '牛奶糖', '果冻']
按名字长度排序: ['薯片', '饼干', '果冻', '棉花糖', '牛奶糖']

最终一共有 5 种零食。
最后一种零食是: 牛奶糖

8. 相关知识点指引

  • 循环与条件判断:遍历时如何只对满足条件的元素操作?结合 if 语句。
  • 字符串与列表的转换"a,b,c".split(",") 可以把一个字符串拆成列表," ".join(list) 可以把列表合成字符串。
  • 列表推导式:一行代码生成新的列表,比如 [x*2 for x in numbers],让代码更简洁。
  • 元组与字典:列表的东西可以修改,元组不能修改;字典用键值对存储数据,适合更复杂的结构。

练习建议:把自己喜欢的游戏角色、考试成绩、零花钱金额用列表存起来,试着做遍历、排序、添加删除等操作。多敲代码,列表就是你最好的数据朋友!

例题精讲

1单选题

执行以下代码后,列表lst的值是什么?\nlst = [1, 2, 3, 4]\nfor x in lst:\n x = x * 2\nprint(lst)

A[1, 2, 3, 4]
B[2, 4, 6, 8]
C[1, 2, 3, 4, 2, 4, 6, 8]
D程序报错
2判断题

在遍历列表时,如果要删除列表中的某些元素,使用for循环直接删除可能会导致遗漏或索引错误。

3填空题
请补全代码,使用for循环遍历列表numbers,计算列表中所有偶数的和。\nnumbers = [12, 7, 9, 24, 15, 18]\ntotal = 0\nfor num in numbers:\n    if ___ :\n        total += num\nprint(total)
4单选题

下列哪段代码可以正确地将列表scores中所有元素的值加10?

Ascores = [80,90,70]; for s in scores: s += 10
Bscores = [80,90,70]; for i in range(len(scores)): scores[i] += 10
Cscores = [80,90,70]; for i in range(scores): scores[i] += 10
Dscores = [80,90,70]; for s in scores: scores[s] += 10
5填空题
请补全代码,使用while循环遍历列表nums,找出最大值并打印。\nnums = [23, 45, 12, 67, 34, 89]\nmax_val = nums[0]\ni = 1\nwhile i < ___ :\n    if nums[i] > max_val:\n        max_val = nums[i]\n    i += 1\nprint(\"最大值:\", max_val)