| 容器 | 比喻 | 特征 | 何时用 |
|---|---|---|---|
| list 列表 | 排队 | 有序、可改、可重复 | 存一组有顺序的数据 |
| tuple 元组 | 密封排队 | 有序、不可改、可重复 | 存一组不该改变的数据 |
| dict 字典 | 名册 | 键值对、键唯一 | 用"名字"快速查找"值" |
| set 集合 | 去重篮 | 无序、不可重复 | 去重、判断包含关系 |
# 创建列表用方括号
numbers = [1, 2, 3, 4, 5]
fruits = ["苹果", "香蕉", "橘子"]
mixed = [1, "hello", True, 3.14] # 可以混合类型
empty = [] # 空列表
# 用list()转换
chars = list("ABC") # ['A', 'B', 'C']
fruits = ["苹果", "香蕉", "橘子", "葡萄", "西瓜"]
# 索引(从0开始,-1是最后一个)
print(fruits[0]) # 苹果
print(fruits[-1]) # 西瓜
print(fruits[2]) # 橘子
# 切片 [起:止:步] —— 左闭右开
print(fruits[1:3]) # ['香蕉', '橘子'] (索引1到2)
print(fruits[:3]) # ['苹果', '香蕉', '橘子'] (从头到2)
print(fruits[2:]) # ['橘子', '葡萄', '西瓜'] (从2到尾)
print(fruits[::2]) # ['苹果', '橘子', '西瓜'] (步长2)
print(fruits[::-1]) # ['西瓜', '葡萄', '橘子', '香蕉', '苹果'] (反转)
lst = [1, 2, 3]
# 改
lst[0] = 10 # [10, 2, 3]
# 增
lst.append(4) # [10, 2, 3, 4] 末尾添加
lst.insert(1, 99) # [10, 99, 2, 3, 4] 在索引1处插入
lst.extend([5, 6]) # [10, 99, 2, 3, 4, 5, 6] 合并另一个列表
# 删
lst.remove(99) # 删除第一个值为99的元素
lst.pop() # 删除并返回最后一个元素
lst.pop(0) # 删除并返回索引0的元素
del lst[0] # 删除索引0的元素
lst.clear() # 清空列表 → []
nums = [3, 1, 4, 1, 5, 9, 2, 6]
# 查找
print(len(nums)) # 8 (长度)
print(nums.count(1)) # 2 (值1出现2次)
print(nums.index(5)) # 4 (值5的索引)
print(5 in nums) # True (是否包含)
# 排序
nums.sort() # 原地排序 [1, 1, 2, 3, 4, 5, 6, 9]
nums.sort(reverse=True) # 降序 [9, 6, 5, 4, 3, 2, 1, 1]
nums.reverse() # 反转
# sorted() — 返回新列表,不改原列表
original = [3, 1, 2]
new_list = sorted(original) # [1, 2, 3],original不变
# 复制
copy1 = nums.copy() # 方法1
copy2 = nums[:] # 方法2(切片)
copy3 = list(nums) # 方法3
# 传统写法
squares = []
for i in range(10):
squares.append(i ** 2)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 推导式写法(一行搞定)
squares = [i ** 2 for i in range(10)]
# 带条件
evens = [i for i in range(20) if i % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 带条件表达式
labels = ["偶" if i % 2 == 0 else "奇" for i in range(5)]
# ['偶', '奇', '偶', '奇', '偶']
# 嵌套推导式
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
# [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
[表达式 for 变量 in 可迭代对象 if 条件]# 创建元组用圆括号
months = ("一月", "二月", "三月")
point = (3, 4) # 坐标
single = (42,) # ⚠️ 单元素元组必须加逗号!
empty = () # 空元组
# 不用括号也行(自动打包)
t = 1, 2, 3 # (1, 2, 3)
a, b, c = t # 解包:a=1, b=2, c=3
# 元组支持索引和切片(和列表一样)
print(months[0]) # 一月
print(months[1:]) # ('二月', '三月')
# ⚠️ 元组不能修改!
# months[0] = "1月" ← 报错!TypeError
# 元组的方法只有 count() 和 index()
print(point.count(3)) # 1
print(point.index(4)) # 1
# 基本解包
x, y = 10, 20
x, y = y, x # 交换变量
# 用 * 收集剩余
first, *rest = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4, 5]
*front, last = [1, 2, 3, 4, 5]
print(front) # [1, 2, 3, 4]
print(last) # 5
# 函数返回多个值(本质是元组)
def min_max(lst):
return min(lst), max(lst)
low, high = min_max([3, 1, 4, 1, 5]) # low=1, high=5
# 用花括号创建
student = {
"name": "张三",
"age": 20,
"grade": "大三",
"courses": ["数学", "英语", "Python"]
}
# 用dict()创建
prices = dict(apple=5, banana=3, orange=4)
# 空字典
empty = {}
student = {"name": "张三", "age": 20}
# 访问
print(student["name"]) # 张三
print(student.get("age")) # 20
print(student.get("phone")) # None (键不存在返回None)
print(student.get("phone", "未填写")) # 未填写 (指定默认值)
# ⚠️ 用[]访问不存在的键会报错!
# student["phone"] ← KeyError!
# 修改/添加
student["age"] = 21 # 修改已有键
student["phone"] = "13800000000" # 添加新键
# 删除
del student["phone"] # 删除键值对
student.pop("age") # 删除并返回值
student.popitem() # 删除最后一个键值对
student.clear() # 清空
student = {"name": "张三", "age": 20, "grade": "大三"}
# 遍历键
for key in student:
print(key)
# 遍历键值对(最常用)
for key, value in student.items():
print(f"{key}: {value}")
# name: 张三
# age: 20
# grade: 大三
# 只遍历值
for v in student.values():
print(v)
# 只遍历键
for k in student.keys():
print(k)
d = {"a": 1, "b": 2}
# 检查键是否存在
print("a" in d) # True
print("c" not in d) # True
# 合并字典
d.update({"c": 3, "d": 4}) # d = {'a':1,'b':2,'c':3,'d':4}
# setdefault — 键不存在时设置默认值
d.setdefault("e", 5) # 添加 'e':5
d.setdefault("a", 99) # 'a'已存在,不做任何事
# 字典推导式
squares = {i: i**2 for i in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 创建集合用花括号
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
# ⚠️ 空集合不能用{}(那是空字典),要用set()
empty_set = set()
# 从列表去重
nums = [1, 2, 2, 3, 3, 3, 4]
unique = set(nums) # {1, 2, 3, 4}
unique_list = list(set(nums)) # [1, 2, 3, 4] 转回列表
# 集合运算
print(s1 & s2) # 交集 {3, 4, 5} 等价 s1.intersection(s2)
print(s1 | s2) # 并集 {1, 2, 3, 4, 5, 6, 7} 等价 s1.union(s2)
print(s1 - s2) # 差集 {1, 2} 等价 s1.difference(s2)
print(s1 ^ s2) # 对称差集 {1, 2, 6, 7} 等价 s1.symmetric_difference(s2)
# 子集/超集判断
print({1, 2} <= {1, 2, 3}) # True (是子集)
print({1, 2, 3} >= {1, 2}) # True (是超集)
# 增删
s1.add(6) # 添加
s1.remove(1) # 删除(不存在会报错)
s1.discard(99) # 删除(不存在不报错)
# 矩阵
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 访问
print(matrix[0]) # [1, 2, 3]
print(matrix[1][2]) # 6 (第2行第3列)
# 遍历
for row in matrix:
for val in row:
print(val, end=" ")
print()
# 学生列表
students = [
{"name": "张三", "age": 20, "score": 85},
{"name": "李四", "age": 22, "score": 92},
{"name": "王五", "age": 21, "score": 78},
]
# 遍历
for student in students:
print(f"{student['name']}: {student['score']}分")
# 查找
for s in students:
if s["name"] == "李四":
print(s)
break
# 筛选:成绩>80的学生
good = [s for s in students if s["score"] > 80]
# 排序:按成绩降序
students.sort(key=lambda s: s["score"], reverse=True)
# 商品目录
products = {
"iphone": {"price": 7999, "stock": 50, "brand": "Apple"},
"galaxy": {"price": 5999, "stock": 30, "brand": "Samsung"},
"mi14": {"price": 3999, "stock": 100, "brand": "Xiaomi"},
}
# 访问
print(products["iphone"]["price"]) # 7999
# 遍历
for name, info in products.items():
print(f"{info['brand']} {name}: ¥{info['price']} (库存{info['stock']})")
创建后可以修改内容
[1,2,3]{'a':1}{1,2,3}修改时内存地址不变
创建后不能修改内容
"hello"(1,2,3)"修改"实际上是创建新对象
a = [1, 2, 3]
b = a # b和a指向同一个列表!
b.append(4)
print(a) # [1, 2, 3, 4] ← a也变了!
# 正确做法
b = a.copy() # 浅拷贝,独立副本
b = a[:] # 同上
import copy
b = copy.deepcopy(a) # 深拷贝(嵌套结构用这个)
给定成绩列表 scores = [85, 92, 78, 65, 95, 88, 72, 90, 85, 60],计算:最高分、最低分、平均分、及格人数(≥60)、优秀人数(≥90)。
scores = [85, 92, 78, 65, 95, 88, 72, 90, 85, 60]
print(f"最高分: {max(scores)}")
print(f"最低分: {min(scores)}")
print(f"平均分: {sum(scores) / len(scores):.1f}")
print(f"及格人数: {sum(1 for s in scores if s >= 60)}")
print(f"优秀人数: {sum(1 for s in scores if s >= 90)}")
输入一段英文,统计每个单词出现的次数,按频率从高到低输出。
text = "the cat sat on the mat the cat ate the rat"
words = text.split()
freq = {}
for word in words:
freq[word] = freq.get(word, 0) + 1
for word, count in sorted(freq.items(), key=lambda x: x[1], reverse=True):
print(f"{word}: {count}")
# the: 4, cat: 2, sat: 1, on: 1, mat: 1, ate: 1, rat: 1
实现一个通讯录:支持添加联系人(姓名→电话)、查找联系人、删除联系人、显示所有联系人。用字典存储,用while循环做菜单。
contacts = {}
while True:
print("\n1.添加 2.查找 3.删除 4.显示 5.退出")
choice = input("选择: ")
if choice == "1":
name = input("姓名: ")
phone = input("电话: ")
contacts[name] = phone
print("添加成功")
elif choice == "2":
name = input("姓名: ")
phone = contacts.get(name, "未找到")
print(f"{name}: {phone}")
elif choice == "3":
name = input("姓名: ")
if name in contacts:
del contacts[name]
print("删除成功")
else:
print("未找到")
elif choice == "4":
for name, phone in contacts.items():
print(f"{name}: {phone}")
elif choice == "5":
break
给定列表 [3,1,4,1,5,9,2,6,3,5,3],去重但保持原始顺序(不能用set直接转,因为set无序)。
nums = [3, 1, 4, 1, 5, 9, 2, 6, 3, 5, 3]
seen = set()
result = []
for n in nums:
if n not in seen:
result.append(n)
seen.add(n)
print(result) # [3, 1, 4, 5, 9, 2, 6]
用字典列表存储5个学生的姓名、年龄、三门科目成绩。计算每个学生的平均分,找出平均分最高的学生。
students = [
{"name": "张三", "age": 20, "scores": [85, 90, 78]},
{"name": "李四", "age": 21, "scores": [92, 88, 95]},
{"name": "王五", "age": 19, "scores": [70, 65, 80]},
{"name": "赵六", "age": 22, "scores": [88, 92, 90]},
{"name": "钱七", "age": 20, "scores": [75, 82, 79]},
]
for s in students:
avg = sum(s["scores"]) / len(s["scores"])
s["avg"] = avg
print(f"{s['name']}: 平均{avg:.1f}")
best = max(students, key=lambda s: s["avg"])
print(f"\n最高分: {best['name']} ({best['avg']:.1f})")