CC++ & Algorithm

Python列表高级用法

中等0
语言版本:C++
概述:学会使用列表的切片、添加、删除、查找等高级操作,像管理一个书包一样灵活地管理数据。

从书包到数据高手——Python列表高级玩法

想象一下,你的书包里装着课本、文具、零食……如果要快速拿出第三本书,或者把巧克力插在第二本笔记本后面,或者倒出所有物品重新排列——这些操作,Python 列表都能轻松做到。列表是编程中最常用的“万能收纳盒”,学完基础创建后,掌握切片、增删、查找和排序这些高级技巧,你就能像整理书包一样灵活地管理数据,无论是班级成绩、零花钱记录,还是游戏背包。

1. 切片:像用尺子量出一段

切片可以一次性取出列表中的一段连续元素,就像用书签标记出一段内容。语法是 列表[开始:结束:步长]注意:结束位置的元素不被包含在内。

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  # 数字列表

# 取前3个元素(索引0到2)
print(numbers[0:3])      # 输出 [0, 1, 2]

# 从索引2开始到最后(省略结束索引)
print(numbers[2:])       # 输出 [2, 3, 4, 5, 6, 7, 8, 9]

# 前5个元素,每两个取一个(步长为2)
print(numbers[0:5:2])    # 输出 [0, 2, 4]

# 每两个取一个,从头到尾(步长2)
print(numbers[::2])      # 输出 [0, 2, 4, 6, 8]

# 翻转整个列表(步长为-1)
print(numbers[::-1])     # 输出 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# 负索引也可以:取最后三个
print(numbers[-3:])      # 输出 [7, 8, 9]

生活中例子:你想从第5分钟到第10分钟的视频里每隔2分钟截一张图,切片 video[5:10:2] 就搞定了。

☑️ 小贴士

  • 开始、结束、步长都可以省略。省略开始默认0,省略结束默认末尾,省略步长默认1。
  • 切片永远不会报索引越界错误,它会自动“截断”到有效范围:
    print(numbers[0:100])  # [0,1,2,3,4,5,6,7,8,9] 不会报错
    print(numbers[5:2])    # [] 因为开始大于结束,返回空列表
    

2. 添加和删除元素:随心调整书包里的东西

就像往书包里放书或扔掉不想要的东西,Python 提供了几种常用方法。

常用方法一览

方法作用例子
append(item)在末尾添加一个元素(像往书包最上面放一本新书)fruit.append('葡萄')
insert(index, item)在指定位置插入(像在书包中间插进一本书)fruit.insert(1, '草莓')
pop(index)删除并返回指定位置的元素(像抽出某一本书),不写index就删除最后一个fruit.pop()fruit.pop(1)
remove(item)删除第一个匹配的元素(像扔掉第一本有某个名字的书)fruit.remove('橘子')
del 列表[index]删除指定位置元素(不返回),也可删除一段切片del fruit[0]del fruit[1:3]
fruit = ['苹果', '香蕉', '橘子']  # 水果列表

fruit.append('葡萄')            # 末尾加葡萄
print(fruit)                    # ['苹果', '香蕉', '橘子', '葡萄']

fruit.insert(1, '草莓')         # 在索引1插入草莓
print(fruit)                    # ['苹果', '草莓', '香蕉', '橘子', '葡萄']

fruit.pop()                     # 删除最后一个'葡萄'
fruit.pop(1)                    # 删除索引1的'草莓'
fruit.remove('橘子')            # 删除第一个'橘子'
print(fruit)                    # ['苹果', '香蕉']

# 使用del删除
my_list = [10, 20, 30, 40]      # 数字列表
del my_list[1]                  # 删除索引1的20
print(my_list)                  # [10, 30, 40]
del my_list[0:2]                # 删除前两个元素
print(my_list)                  # [40]

❓ 常见错误

  • remove() 只删除第一个匹配项。如果列表里有多个相同的元素,它不会全部删除。
  • pop()del 如果索引超出范围会报 IndexError
  • remove() 如果元素不存在会报 ValueError。建议先用 in 判断:
    if '哈密瓜' in fruit:
        fruit.remove('哈密瓜')
    

3. 查找和计数:找到铅笔,数数有几块橡皮

  • index(item):返回某个元素第一次出现的索引。如果找不到,程序会报错。
  • count(item):数一数某个元素出现了几次。
  • in 关键字:判断元素是否存在,返回 TrueFalse,比 index 更安全。
scores = [88, 92, 88, 76, 88]   # 考试成绩列表

print(scores.index(92))         # 输出 1(92在索引1)
print(scores.count(88))         # 输出 3(88出现了3次)

# 安全查找:先判断是否存在
if 92 in scores:
    pos = scores.index(92)
    print(f"92分在位置{pos}")   # 输出 "92分在位置1"
else:
    print("没找到92分")

# 也可以用index捕获异常
try:
    pos = scores.index(100)     # 100不在列表中
except ValueError:
    print("100不在成绩中")

生活中例子:你记录了一周的零花钱 pocket = [10, 20, 10, 50, 10],想知道10元出现了几次,pocket.count(10) 就得出来3次。

4. 排序与反转:把书按大小排好,或者倒着放

  • sort()原地排序(改变原列表),默认从小到大。
  • sorted()返回一个新列表,原列表不变。可以加参数 reverse=True 实现降序。
  • reverse():把列表顺序颠倒过来(原地操作)。
nums = [3, 1, 4, 1, 5, 9]       # 数字列表

nums.sort()                     # 原地从小到大排序
print(nums)                     # [1, 1, 3, 4, 5, 9]

nums.reverse()                  # 原地颠倒顺序
print(nums)                     # [9, 5, 4, 3, 1, 1]

# 用sorted得到新列表,原列表不变
original = [3, 1, 4]
new_list = sorted(original)     # 返回新列表
print(original)                 # [3, 1, 4] 不变
print(new_list)                 # [1, 3, 4]

# 降序排序
print(sorted(original, reverse=True))  # [4, 3, 1]

❓ 常见错误

  • sort() 方法返回值是 None,不要写成 nums = nums.sort(),这会丢失原列表!正确做法是直接 nums.sort()
  • reverse() 同理,也是原地操作,返回 None
  • 如果列表里有不同类型(比如数字和字符串混合),sort() 会报错。

进阶:按规则排序 sort()sorted() 还有一个 key 参数,可以指定排序依据。比如按字符串长度排序:

words = ['banana', 'apple', 'kiwi']   # 单词列表
words.sort(key=len)                    # 按单词长度排序
print(words)                           # ['kiwi', 'apple', 'banana']

5. 额外技巧:列表推导式——一行生成新列表

虽然不在基础列表方法里,但它是非常实用的“高级用法”。比如你想快速生成1到10的平方数,传统写法要写好几行,而列表推导式一行搞定:

# 传统写法
squares = []
for i in range(1, 11):
    squares.append(i * i)

# 列表推导式(推荐)
squares = [i * i for i in range(1, 11)]   # 平方数列表
print(squares)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 还可以加条件:只取偶数
evens = [x for x in range(10) if x % 2 == 0]   # 偶数列表
print(evens)  # [0, 2, 4, 6, 8]

列表推导式就像用模板快速批量生产列表,写起来简洁又高效。

完整示例:班级成绩管理系统

下面结合所有技巧,模拟老师管理一个班级的考试成绩:

# 初始成绩列表(全班10人)
scores = [85, 92, 78, 90, 88, 76, 95, 82, 91, 84]  # 成绩列表

# 1. 切片:取前5名(假设按原顺序)
print("前5个成绩:", scores[:5])          # [85, 92, 78, 90, 88]

# 2. 添加:新同学考了88分
scores.append(88)                       # 末尾添加
print("添加后:", scores)

# 3. 删除:一位同学转学,删除索引2的成绩(78分)
removed_score = scores.pop(2)           # 弹出并返回
print(f"删除了{removed_score}分,现在列表: {scores}")

# 4. 查找:找到92分的位置
if 92 in scores:
    pos = scores.index(92)
    print(f"92分在索引{pos}")
else:
    print("没有92分")

# 5. 查找:计算90分以上的人数
high_count = sum(1 for s in scores if s >= 90)  # 使用生成器表达式
print(f"90分以上有{high_count}人")

# 6. 排序:按分数从高到低排列
scores_sorted = sorted(scores, reverse=True)   # 降序新列表
print("成绩排名(降序):", scores_sorted)

# 7. 反转:将原列表颠倒试试
scores.reverse()
print("原列表颠倒:", scores)

# 8. 列表推导式:生成每个成绩的等级(>90为A,>80为B,其余C)
grades = ['A' if s >= 90 else 'B' if s >= 80 else 'C' for s in scores_sorted]
print("对应等级:", grades)

运行这段程序,你会看到成绩被灵活处理的全过程。

总结与相关指引

列表高级用法让你的数据处理效率翻倍。记住几个要点:

  • 切片不报错,索引操作要小心越界
  • sort()reverse() 原地操作,sorted()reversed() 返回新对象
  • remove() 只删第一个,pop() 按位置删
  • 列表推导式比循环更简洁

接下来你可以学习:

  • 元组:和列表相似但不可修改,适合存储固定数据(如一周的天数)
  • 字符串:也支持切片、indexcount 等操作,用法类似
  • 字典:用“键”来查找值,像查字典一样快
  • 队列与栈:用列表模拟先进先出(队列)或后进先出(栈)的数据结构

掌握列表,就等于拿到了 Python 数据管理的钥匙,快去试试整理你自己的“书包”吧!

例题精讲

1单选题

下列哪个选项可以正确获取列表 my_list = [10, 20, 30, 40, 50] 中的元素 [20, 30, 40]?

Amy_list[1:4]
Bmy_list[1:3]
Cmy_list[2:4]
Dmy_list[0:3]
2单选题

已知列表 fruits = ['apple', 'banana'],执行以下哪个操作后,fruits 变为 ['apple', 'banana', 'grape', 'orange']?

Afruits.append(['grape', 'orange'])
Bfruits.extend(['grape', 'orange'])
Cfruits.insert(2, 'grape', 'orange')
Dfruits += ['grape', 'orange']
3判断题

执行 my_list = [1, 2, 3, 2, 4]后,再执行 my_list.remove(2),最终 my_list 为 [1, 3, 2, 4]。

4填空题
使用列表推导式生成一个包含1到10之间所有偶数的平方的列表,补全代码:
even_squares = [x**2 for x in range(1, 11) if ___]
5填空题
给定列表 lst = [10, 20, 30, 40, 50],请用切片操作将列表反转并赋值给 new_lst,补全代码:
new_lst = lst[___]