Python 列表详解:可变有序序列的操作与实践
列表(list)是 Python 中最常用的数据结构之一,它是一种**有序、可变、允许重复元素**的容器,能够存储任意类型的对象(如整数、字符串、布尔值、甚至其他列表或字典)。与元组(tuple)不同,列表支持在运行时动态增删改查,适用于需要频繁修改数据集合的场景。
1. 创建与初始化
列表使用方括号 [] 定义,元素之间用逗号分隔。空列表可直接写作 [],也可通过构造函数 list() 创建:
# 直接定义
mixed_items = [42, "hello", True, 3.14, None]
empty_list = []
# 使用构造函数(常用于将其他可迭代对象转为列表)
chars = list("python") # ['p', 'y', 't', 'h', 'o', 'n']
numbers = list(range(3)) # [0, 1, 2]
2. 核心操作方法
2.1 尾部追加:append()
向列表末尾添加单个元素,原地修改,不返回新列表(返回 None):
stack = []
stack.append("first")
stack.append("second")
print(stack) # ['first', 'second']
2.2 批量扩展:extend()
将另一个可迭代对象(如列表、元组、字符串)的所有元素逐个添加到当前列表末尾:
fruits = ["apple", "banana"]
fruits.extend(["cherry", "date"])
print(fruits) # ['apple', 'banana', 'cherry', 'date']
# 等价于手动循环调用 append()
for item in ["cherry", "date"]:
fruits.append(item)
2.3 指定位置插入:insert(index, value)
在索引 index 处插入新元素;若 index 超出范围,则自动插入到末尾(正向越界)或开头(负向越界):
tasks = ["review code", "write tests"]
tasks.insert(0, "setup env") # ['setup env', 'review code', 'write tests']
tasks.insert(10, "deploy") # 插入到末尾 → ['setup env', 'review code', 'write tests', 'deploy']
2.4 值匹配删除:remove(value)
从左至右查找并移除第一个匹配的元素;若不存在则抛出 ValueError:
scores = [85, 92, 78, 92, 88]
scores.remove(92) # 移除首个 92
print(scores) # [85, 78, 92, 88]
# 安全删除模式
if 100 in scores:
scores.remove(100)
2.5 索引定位删除:pop([index])
移除并返回指定索引处的元素;默认移除最后一个(pop()),常用于实现栈(LIFO)行为:
queue = ["Alice", "Bob", "Charlie"]
first_served = queue.pop(0) # 队列式服务(FIFO)
print(first_served) # Alice
print(queue) # ['Bob', 'Charlie']
last_item = queue.pop() # 栈式弹出
print(last_item) # Charlie
2.6 清空全部:clear()
移除列表中所有元素,使其长度变为 0:
cache = [1, 2, 3, 4, 5]
cache.clear()
print(cache) # []
2.7 查找索引:index(value, [start, end])
返回首次出现该值的索引;可选参数限制搜索范围;未找到则报错:
data = ["a", "b", "c", "b", "d"]
pos = data.index("b") # 1
pos2 = data.index("b", 2) # 3(从索引2开始查找)
2.8 排序:sort(key=None, reverse=False)
对列表进行原地排序,默认升序;支持自定义键函数和降序排列。注意:仅适用于同质类型(如全数字或全字符串):
ages = [28, 35, 22, 41]
ages.sort() # [22, 28, 35, 41]
ages.sort(reverse=True) # [41, 35, 28, 22]
names = ["Zoe", "alice", "Bob"]
names.sort(key=str.lower) # 忽略大小写排序 → ['alice', 'Bob', 'Zoe']
2.9 反转顺序:reverse()
原地反转列表元素顺序:
order = ["start", "middle", "end"]
order.reverse()
print(order) # ['end', 'middle', 'start']
3. 实用案例
3.1 动态用户注册系统
registered_users = []
while True:
username = input("请输入用户名(输入 'quit' 结束): ").strip()
if not username or username.lower() == "quit":
break
if username not in registered_users:
registered_users.append(username)
print(f"✅ 已注册:{username}")
else:
print("⚠️ 用户名已存在,请重试")
print(f"当前共 {len(registered_users)} 名用户:{registered_users}")
3.2 抽奖管理系统(带去重与状态反馈)
import random
prizes = ["iPhone 15", "AirPods", "MacBook", "iPad", "Watch"]
participants = ["李明", "王芳", "张伟", "陈静"]
random.shuffle(participants) # 打乱顺序确保公平性
winners = []
for i, person in enumerate(participants[:len(prizes)]):
prize = prizes[i]
winners.append((person, prize))
print(f"🎉 {person} 抽中 {prize}")
# 输出结果
for name, award in winners:
print(f"获奖者:{name} —— 奖品:{award}")
4. 注意事项
- 列表是可变对象,赋值时传递的是引用而非副本(如需复制请使用
copy()或切片[:]); - 混合类型列表虽合法,但会限制部分操作(如
sort())的可用性; - 高频插入/删除头部元素建议改用
collections.deque提升性能; - 大量数据筛选推荐使用列表推导式或
filter(),比循环 +remove()更高效。