Python列表、字典、集合高阶操作精讲:从基础到工程实战
导语: 列表、字典、集合是Python最核心的数据结构,也是面试和实战中出现频率最高的考点。大多数初学者只会基础增删改查,却不知道推导式、zip/enumerate组合、字典合并新写法、集合运算等高阶技巧。本文深入拆解这三大数据结构的高阶用法,结合真实开发场景,帮你彻底打通Python数据处理的底层逻辑。
一、列表高阶操作
1.1 列表推导式(List Comprehension)
列表推导式是Python最具代表性的语法糖,写法简洁、执行效率高于普通for循环。
python
# 普通写法
squares = []
for i in range(10):
squares.append(i ** 2)
# 推导式写法(推荐)
squares = [i ** 2 for i in range(10)]
# 带条件过滤
even_squares = [i ** 2 for i in range(10) if i % 2 == 0]
# 嵌套推导式------展开二维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
1.2 enumerate 与 zip 的实战组合
python
# enumerate:同时获取索引和值
fruits = ['apple', 'banana', 'cherry']
for idx, fruit in enumerate(fruits, start=1):
print(f"{idx}. {fruit}")
# zip:并行遍历多个列表
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}: {score}分")
# zip 转字典
result = dict(zip(names, scores))
# {'Alice': 85, 'Bob': 92, 'Charlie': 78}
1.3 sorted + key 参数的灵活排序
python
# 按字符串长度排序
words = ['banana', 'fig', 'apple', 'cherry']
words_sorted = sorted(words, key=len)
# ['fig', 'apple', 'banana', 'cherry']
# 按字典字段排序
students = [
{'name': 'Alice', 'score': 85},
{'name': 'Bob', 'score': 92},
{'name': 'Charlie', 'score': 78},
]
sorted_students = sorted(students, key=lambda x: x['score'], reverse=True)
# 多字段排序
data = [('Alice', 25, 85), ('Bob', 23, 92), ('Alice', 22, 78)]
data_sorted = sorted(data, key=lambda x: (x[0], -x[2]))
二、字典高阶操作
2.1 字典推导式
python
# 反转键值
original = {'a': 1, 'b': 2, 'c': 3}
reversed_dict = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}
# 过滤字典
high_scores = {name: score for name, score in result.items() if score >= 85}
2.2 字典合并(Python 3.9+ 新写法)
python
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# Python 3.9+ 推荐写法(| 运算符)
merged = dict1 | dict2 # {'a': 1, 'b': 3, 'c': 4}
# 原地更新
dict1 |= dict2
# 兼容旧版本写法
merged_old = {**dict1, **dict2}
2.3 defaultdict 与 Counter 实战
python
from collections import defaultdict, Counter
# defaultdict:避免 KeyError
word_count = defaultdict(int)
for word in ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']:
word_count[word] += 1
# Counter:专业词频统计
counter = Counter(['apple', 'banana', 'apple', 'cherry', 'banana', 'apple'])
print(counter.most_common(2)) # [('apple', 3), ('banana', 2)]
# 分组统计(groupby 模拟)
from collections import defaultdict
employees = [
{'name': 'Alice', 'dept': 'Engineering'},
{'name': 'Bob', 'dept': 'Marketing'},
{'name': 'Charlie', 'dept': 'Engineering'},
]
dept_map = defaultdict(list)
for emp in employees:
dept_map[emp['dept']].append(emp['name'])
# defaultdict(<class 'list'>, {'Engineering': ['Alice', 'Charlie'], 'Marketing': ['Bob']})
2.4 字典安全取值与嵌套访问
python
# get() 安全取值
config = {'host': 'localhost', 'port': 8080}
timeout = config.get('timeout', 30) # 不存在返回默认值30
# setdefault:不存在则设置默认值
config.setdefault('debug', False)
# 深层嵌套安全访问(避免 KeyError)
data = {'user': {'profile': {'age': 25}}}
age = data.get('user', {}).get('profile', {}).get('age', 0)
三、集合高阶操作
3.1 集合运算实战
python
a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7}
# 交集
print(a & b) # {3, 4, 5}
print(a.intersection(b))
# 并集
print(a | b) # {1, 2, 3, 4, 5, 6, 7}
# 差集(a 中有但 b 中没有)
print(a - b) # {1, 2}
# 对称差集(只在一个集合中出现的元素)
print(a ^ b) # {1, 2, 6, 7}
3.2 列表去重利器
python
# 快速去重(不保留顺序)
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
unique = list(set(lst))
# 保留顺序去重
seen = set()
unique_ordered = []
for item in lst:
if item not in seen:
seen.add(item)
unique_ordered.append(item)
# Python 3.7+ dict保留插入顺序的去重
unique_ordered = list(dict.fromkeys(lst))
3.3 frozenset 的使用场景
python
# frozenset 可作为字典 key 或集合中的元素
pairs = frozenset({1, 2})
graph = {frozenset({1, 2}): '边A', frozenset({2, 3}): '边B'}
四、开发痛点与报错避坑指南
| 问题场景 | 常见错误 | 正确做法 |
|---|---|---|
| 遍历时修改列表 | RuntimeError: list changed size |
遍历副本 for item in lst[:] |
| 字典 Key 不存在 | KeyError |
使用 get() 或 defaultdict |
| 列表推导式性能 | 超大数据OOM | 改用生成器表达式 (x for x in ...) |
| 集合元素不可哈希 | TypeError: unhashable type |
元素必须是不可变类型 |
| zip 长度不一致 | 短序列截断 | 使用 itertools.zip_longest 填充 |
python
# 遍历时安全删除
lst = [1, 2, 3, 4, 5, 6]
lst = [x for x in lst if x % 2 != 0] # 推荐
# zip_longest 处理不等长序列
from itertools import zip_longest
a = [1, 2, 3]
b = ['a', 'b']
result = list(zip_longest(a, b, fillvalue=None))
# [(1, 'a'), (2, 'b'), (3, None)]
五、全文总结
- 列表 :推导式提升可读性和效率,
sorted+key应对复杂排序,enumerate/zip简化遍历逻辑 - 字典 :推导式+Counter+defaultdict是数据聚合利器,Python 3.9+的
|合并更简洁 - 集合:天然去重,集合运算(交并差)是数据对比清洗的最优方案
掌握这三大结构的高阶操作,能将日常数据处理效率提升3-5倍,也是通过大厂Python面试的必备能力。
六、技术进阶展望
- 深入
itertools、functools模块,解锁更多函数式编程范式 - 学习
pandasDataFrame ------ 字典与列表在数据分析层面的升级形态 - 探索
attrs、dataclasses实现结构化数据模型