3Python编程:从入门到实践(第3版)

列表简介

有序数据的集合

列表列表操作切片

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第3章:列表简介(Introducing Lists)

一、导读

1.1 本章学习目标

第3章介绍Python最重要的数据结构之一:列表(list)。列表是Python中最灵活、最常用的容器类型。本章核心目标:

  • 掌握列表的创建和初始化:如何创建列表?
  • 学会访问列表元素:索引和负索引的使用
  • 熟练修改列表:添加、删除、修改元素
  • 理解列表切片:获取子列表的强大工具
  • 掌握列表的遍历方式:for循环和enumerate
  • 了解列表的常用方法:sort、reverse、copy等

1.2 为什么本章如此重要

列表是Python编程中使用频率最高的数据结构。无论是存储数据、处理数据还是传递数据,列表都是首选。理解列表的操作方式和性能特征,是编写Pythonic代码的基础。

1.3 核心问题引导

Python列表和C/Java的数组有什么本质区别?

列表的负索引是什么意思?list[-1] 代表什么?

切片操作的步长参数有什么作用?list[::-1] 是什么意思?

del、pop() 和 remove() 删除元素有什么区别?

列表的 sort() 方法和 sorted() 函数有什么区别?


二、核心概念详解

3.1 列表的创建

python
# 创建列表
fruits = ["apple", "banana", "cherry", "date"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]  # 可以混合类型
empty = []

# 使用list()函数
chars = list("hello")  # ['h', 'e', 'l', 'l', 'o']
nums = list(range(1, 6))  # [1, 2, 3, 4, 5]

# 列表推导式(下一章详细介绍)
squares = [x**2 for x in range(1, 6)]  # [1, 4, 9, 16, 25]

3.2 访问元素

python
fruits = ["apple", "banana", "cherry", "date", "elderberry"]

# 正向索引(从0开始)
print(fruits[0])   # apple
print(fruits[2])   # cherry

# 负索引(从末尾开始)
print(fruits[-1])  # elderberry(最后一个)
print(fruits[-2])  # date(倒数第二个)

# 修改元素
fruits[1] = "blueberry"
print(fruits)  # ['apple', 'blueberry', 'cherry', 'date', 'elderberry']

3.3 添加元素

python
fruits = ["apple", "banana"]

# append():末尾添加
fruits.append("cherry")
print(fruits)  # ['apple', 'banana', 'cherry']

# insert():指定位置插入
fruits.insert(1, "avocado")
print(fruits)  # ['apple', 'avocado', 'banana', 'cherry']

# extend():添加多个元素
fruits.extend(["date", "elderberry"])
print(fruits)  # ['apple', 'avocado', 'banana', 'cherry', 'date', 'elderberry']

# 使用+运算符
fruits = fruits + ["fig", "grape"]
print(fruits)

3.4 删除元素

python
fruits = ["apple", "banana", "cherry", "date", "elderberry"]

# del:按索引删除
del fruits[0]
print(fruits)  # ['banana', 'cherry', 'date', 'elderberry']

# pop():弹出指定位置(默认最后一个)
popped = fruits.pop()
print(f"Popped: {popped}")  # elderberry
print(fruits)  # ['banana', 'cherry', 'date']

popped2 = fruits.pop(1)
print(f"Popped: {popped2}")  # cherry

# remove():按值删除(只删除第一个匹配)
fruits.remove("banana")
print(fruits)  # ['date']

# clear():清空列表
fruits.clear()
print(fruits)  # []

3.5 列表切片

切片是Python最强大的特性之一:

python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 基本切片 [start:stop](不包含stop)
print(numbers[2:5])    # [2, 3, 4]
print(numbers[:3])     # [0, 1, 2](从头开始)
print(numbers[7:])     # [7, 8, 9](到末尾)
print(numbers[:])      # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9](整个列表的副本)

# 带步长 [start:stop:step]
print(numbers[::2])    # [0, 2, 4, 6, 8](偶数索引)
print(numbers[1::2])   # [1, 3, 5, 7, 9](奇数索引)
print(numbers[::-1])   # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0](反转)
print(numbers[7:3:-1]) # [7, 6, 5, 4](反向切片)

# 切片赋值
numbers[2:5] = [20, 30, 40]
print(numbers)  # [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]

# 切片插入
numbers[3:3] = [100, 200]
print(numbers)  # [0, 1, 20, 100, 200, 30, 40, 5, 6, 7, 8, 9]

# 切片删除
numbers[3:5] = []
print(numbers)  # [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]

3.6 列表遍历

python
colors = ["red", "green", "blue", "yellow"]

# 基本for循环
for color in colors:
    print(color)

# 带索引遍历(enumerate)
for i, color in enumerate(colors):
    print(f"{i}: {color}")

# 同时遍历多个列表(zip)
names = ["Alice", "Bob", "Charlie"]
ages = [20, 25, 30]
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

# 反向遍历
for color in reversed(colors):
    print(color)

# 排序遍历
for color in sorted(colors):
    print(color)

3.7 列表的常用方法

python
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]

# 统计
print(len(numbers))       # 9
print(min(numbers))       # 1
print(max(numbers))       # 9
print(sum(numbers))       # 36
print(numbers.count(5))   # 2(5出现的次数)
print(numbers.index(9))   # 5(9的索引)

# 排序
numbers.sort()            # 原地排序
print(numbers)            # [1, 1, 2, 3, 4, 5, 5, 6, 9]

numbers.sort(reverse=True)  # 降序
print(numbers)

# sorted()返回新列表,不修改原列表
original = [3, 1, 4, 1, 5]
new_list = sorted(original)
print(original)   # [3, 1, 4, 1, 5](未变)
print(new_list)   # [1, 1, 3, 4, 5]

# 反转
numbers.reverse()   # 原地反转

# 复制
a = [1, 2, 3]
b = a              # b和a指向同一个列表
c = a.copy()       # c是a的副本
d = a[:]           # 也是副本

b.append(4)
print(a)  # [1, 2, 3, 4](a也被修改了!)
print(c)  # [1, 2, 3](c不受影响)

三、实战案例

3.1 学生成绩管理

python
# 学生成绩管理
scores = []

# 输入成绩
while True:
    score = input("Enter score (or 'done'): ")
    if score.lower() == 'done':
        break
    scores.append(float(score))

if scores:
    print(f"\n--- Results ---")
    print(f"Count: {len(scores)}")
    print(f"Average: {sum(scores) / len(scores):.1f}")
    print(f"Highest: {max(scores):.1f}")
    print(f"Lowest: {min(scores):.1f}")
    
    # 等级分布
    grades = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'F': 0}
    for s in scores:
        if s >= 90: grades['A'] += 1
        elif s >= 80: grades['B'] += 1
        elif s >= 70: grades['C'] += 1
        elif s >= 60: grades['D'] += 1
        else: grades['F'] += 1
    
    print("\n--- Grade Distribution ---")
    for grade, count in grades.items():
        bar = "█" * count
        print(f"{grade}: {bar} ({count})")

3.2 列表实现栈和队列

python
# 栈(后进先出)
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop())  # 3
print(stack.pop())  # 2
print(stack)        # [1]

# 队列(先进先出)
from collections import deque
queue = deque()
queue.append("Alice")
queue.append("Bob")
queue.append("Charlie")
print(queue.popleft())  # Alice
print(queue.popleft())  # Bob
print(queue)            # deque(['Charlie'])

四、本章小结

第3章介绍了Python列表的核心操作:

创建和访问:列表是有序、可变的集合,支持正负索引。

修改:append、insert、extend添加元素;del、pop、remove删除元素。

切片:Python最强大的特性之一,支持start:stop:step语法。

遍历:for循环、enumerate、zip、reversed、sorted。

方法:sort、reverse、copy、count、index等。


五、思考与练习

思考题

Python列表的底层实现是什么?和C的数组有什么区别?

列表切片的副本和原列表是什么关系?浅拷贝和深拷贝有什么区别?

list.sort() 和 sorted(list) 有什么区别?什么时候用哪个?

为什么列表的 insert(0, x) 操作比 append(x) 慢得多?

编程练习

编写程序,接收用户输入的一组数字,输出排序后的结果和统计信息。

实现一个简单的待办事项管理器(添加、完成、删除、显示)。

编写程序,找出列表中的第二大的数和出现次数最多的元素。


3/11列表简介
0%