列表字典与集合
list/dict/tuple/set 常用操作。
列表字典与集合
这一课你将能做到
- 熟练操作 list 的增删改查、排序、切片,并说清 tuple 与 list 的取舍
- 用 dict 完成键值存取、遍历、安全取值(get / in),写出统计词频这类高频小任务
- 用 set 完成去重与交并差运算,并根据「要不要有序、要不要去重」四象限选对容器
为什么要学
真实程序 80% 的时间在和数据结构打交道:爬回来的结果存列表、用户配置存字典、标签去重用集合、不该被改的坐标用元组。Java 里你得选 ArrayList、HashMap、HashSet;Python 里对应 list、dict、set,而且是内置类型,直接写 [] {} 就有。容器用不对,后面写文件、写类、做数据分析全是别扭的。
人话:list 是排队(有顺序、可插队);dict 是通讯录(名字查电话,速度快);set 是点名册(只记来没来过,不重复);tuple 是刻在石头上的名单(写完不许改)。
先建立图像
list ["a","b","c"] 有序 · 可变 · 可重复 → 排队
tuple ("a","b","c") 有序 · 不可变 · 可重复 → 石碑
dict {"a":1,"b":2} 键值对 · 键唯一 · 3.7+保持插入序 → 通讯录
set {"a","b"} 无序 · 可变 · 自动去重 → 点名册
四象限选型:
有序 无序
可变 list set
不可变 tuple ——(frozenset 冷门)
需要「键找值」→ dict
跟着做
步骤 1:list 增删改查全流程
新建 collections_demo.py:
nums = [3, 1, 4, 1, 5]
# 查:下标从 0 开始,负数从尾数
print(nums[0], nums[-1]) # 3 5
# 增:append 尾加,insert 指定位置,extend 合并
nums.append(9)
nums.insert(0, 100)
nums.extend([2, 6])
print(nums) # [100, 3, 1, 4, 1, 5, 9, 2, 6]
# 删:remove 按值删第一个,pop 按下标删并返回,del 按下标删
nums.remove(100)
last = nums.pop() # 删尾并返回 6
del nums[0]
print(nums, "被 pop 的:", last) # [3, 1, 4, 1, 5, 9, 2]
# 改:下标直接赋值
nums[0] = 33
print(nums[0]) # 33
# 成员判断与长度
print(5 in nums, len(nums)) # True 7
输出:
3 5
[100, 3, 1, 4, 1, 5, 9, 2, 6]
[3, 1, 4, 1, 5, 9, 2] 被 pop 的: 6
33
True 7
步骤 2:排序与切片
scores = [88, 72, 95, 60]
print(sorted(scores)) # [60, 72, 88, 95] 返回新列表
print(scores) # [88, 72, 95, 60] 原列表没动
scores.sort(reverse=True) # 原地降序,返回 None!
print(scores) # [95, 88, 72, 60]
words = ["banana", "fig", "apple"]
print(sorted(words, key=len)) # 按长度排:['fig', 'apple', 'banana']
# 切片 [start:stop:step],含头不含尾
nums = [0, 1, 2, 3, 4, 5]
print(nums[1:4]) # [1, 2, 3]
print(nums[:3]) # [0, 1, 2] 前 3 个
print(nums[-2:]) # [4, 5] 最后 2 个
print(nums[::2]) # [0, 2, 4] 隔一个取一个
print(nums[::-1]) # [5, 4, 3, 2, 1, 0] 反转
copy = nums[:] # 浅拷贝整个列表