第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 列表的创建
# 创建列表
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 访问元素
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 添加元素
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 删除元素
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最强大的特性之一:
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 列表遍历
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 列表的常用方法
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 学生成绩管理
# 学生成绩管理
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 列表实现栈和队列
# 栈(后进先出)
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) 慢得多?
编程练习
编写程序,接收用户输入的一组数字,输出排序后的结果和统计信息。
实现一个简单的待办事项管理器(添加、完成、删除、显示)。
编写程序,找出列表中的第二大的数和出现次数最多的元素。