列表(list)和字典(dict)是 Python 中使用频率最高的两种容器:前者处理"有序的一串东西",后者处理"键到值的映射"。90% 的数据处理任务都可以抽象成"列表 + 字典"的组合。本文不讲 API 清单,而是用实战场景带你掌握它们的正确打开方式。

1. 列表:增删改查

列表是可变序列,增删改查各有多种手段,按场景选最合适的:

tasks = ["写代码", "测试", "部署"]
tasks.append("维护")          # 末尾添加
tasks.insert(1, "评审")       # 指定位置插入
tasks.remove("测试")          # 按值删除(只删第一个)
last = tasks.pop()            # 弹出末尾并返回
first = tasks.pop(0)          # 弹出指定下标
print(tasks)                  # ['写代码', '评审', '部署']
print("部署" in tasks)
print(len(tasks))

2. 切片与复制

切片 [start:end:step] 是列表最强大的语法,还能用来做浅拷贝:

nums = [0, 1, 2, 3, 4, 5]
print(nums[1:4])     # [1, 2, 3] 含头不含尾
print(nums[:3])      # [0, 1, 2]
print(nums[::2])     # [0, 2, 4] 隔一个取一个
print(nums[::-1])    # [5, 4, 3, 2, 1, 0] 反转

# 三种拷贝方式
copy1 = nums[:]
copy2 = nums.copy()
copy3 = list(nums)

# 注意:嵌套列表的浅拷贝只复制外层
matrix = [[1, 2], [3, 4]]
shallow = matrix[:]
shallow[0][0] = 99
print(matrix)        # [[99, 2], [3, 4]] 内层被改了!

需要完全独立的副本时用 copy.deepcopy()

3. 排序与去重

scores = [88, 72, 95, 61, 88]
scores.sort()               # 原地升序
print(scores)               # [61, 72, 88, 88, 95]

# 不修改原列表的排序
sorted_scores = sorted(scores, reverse=True)
print(sorted_scores)        # [95, 88, 88, 72, 61]

# 去重:转 set 再转回 list
unique = list(set(scores))
print(unique)               # [72, 88, 95, 61] 顺序不保证

需要保持顺序去重时,用 dict.fromkeys() 或遍历 + 集合记录。

4. 字典:键值对操作

字典查找是 O(1) 的,是"按名字找东西"的首选。增删改查与安全取值:

user = {"name": "Ada", "age": 18}
user["city"] = "北京"          # 新增键
user["age"] = 19              # 修改已有键
del user["city"]              # 删除键

# get:键不存在时返回默认值,不报错
age = user.get("age", 0)      # 19
email = user.get("email", "未填写")   # 未填写

# 合并两个字典
user.update({"hobby": "coding", "age": 20})
print(user)

5. 遍历字典的三种姿势

stock = {"苹果": 5, "香蕉": 12, "橙子": 0}

for key in stock:                 # 默认遍历键
    print(key)

for key, value in stock.items():  # 键值对
    print(f"{key}: {value}")

for value in stock.values():      # 只取值
    print(value)

# 条件筛选:库存不足的水果
low = [k for k, v in stock.items() if v == 0]
print(low)   # ['橙子']

6. 综合实战:统计词频

把列表和字典组合起来,完成一个经典任务——统计文本中每个单词出现的次数:

text = "python code data python code python"
words = text.split()

freq = {}
for w in words:
    freq[w] = freq.get(w, 0) + 1   # 等价于 if/else 计数

# 按出现次数从高到低排序
ranking = sorted(freq.items(), key=lambda x: x[1], reverse=True)
print(ranking)   # [('python', 3), ('code', 2), ('data', 1)]

# 用 collections.Counter 一行搞定
from collections import Counter
print(Counter(words).most_common(2))
💡 学习建议:把"词频统计"这个例子自己重写三遍(纯循环版、get 版、Counter 版),体会三种写法的演进。列表 + 字典的组合能解决绝大多数入门级数据处理问题。