# 传统方式 user_data= [('Alice', 28), ('Bob', 32), ('Charlie', 45)] user_dict= {} for name, age in user_data: user_dict[name] =age*2# 年龄加倍 # 字典推导式 user_dict= {name: age*2 for name, age in user_data}
original= {'a': 1, 'b': 2, 'c': 3} reversed_dict= {value: key for key, value in original.items()} print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}
2. 合并两个字典
dict1= {'a': 1, 'b': 2} dict2= {'b': 3, 'c': 4} # 后者优先覆盖 merged= {**dict1, **dict2} # 字典解包技巧 # 或使用推导式 merged= {k: dict2.get(k, dict1.get(k)) for k in set(dict1) | set(dict2)}
3. 枚举转字典
from enum import Enum class Color(Enum): RED=1 GREEN=2 BLUE=3 color_dict= {color.name: color.value for color in Color} print(color_dict) # {'RED': 1, 'GREEN': 2, 'BLUE': 3}
4. 矩阵转置
matrix= [[1, 2, 3], [4, 5, 6], [7, 8, 9]] transposed= {i: [row[i] for row in matrix] for i in range(len(matrix[0]))} print(transposed) # {0: [1, 4, 7], 1: [2, 5, 8], 2: [3, 6, 9]}
5. 数据分组
from collections import defaultdict data= [('apple', 'fruit'), ('carrot', 'vegetable'), ('banana', 'fruit')] # 传统分组 grouped=defaultdict(list) for item, category in data: grouped[category].append(item) # 推导式分组(Python 3.8+) grouped= {} for item, category in data: grouped.setdefault(category, []).append(item)
6. 类型转换
# 元组列表 → 字典 tuple_list= [('a', 1), ('b', 2), ('c', 3)] dict_from_tuples= {k: v for k, v in tuple_list} # 两个列表 → 字典 keys= ['name', 'age', 'gender'] values= ['Alice', 30, 'F'] dict_from_lists= {keys[i]: values[i] for i in range(len(keys))}
7. JSON数据处理
import json json_data='[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]' # 一行创建ID映射字典 id_map= {item['id']: item['name'] for item in json.loads(json_data)} print(id_map) # {1: 'Alice', 2: 'Bob'}
性能优化:何时该用?何时不该用?
✅ 适用场景:
数据转换(CSV/JSON处理)
简单过滤和映射
小到中等数据集(<10万条)
需要代码简洁度的场景
❌ 避免场景:
# 1. 复杂逻辑(可读性差) result= {k: complex_func(v) if condition1(v) else another_func(v) for k, v in data} # 2. 超大数据集(内存问题) # 改用生成器表达式 gen= ((k, process(v)) for k, v in large_data.items()) result=dict(gen) # 3. 依赖中间状态 # 错误示例: total=0 cumulative= {k: (total :=total+v) for k, v in data} # 海象运算符滥用
三大常见陷阱及解决方案
陷阱1:键重复导致数据丢失
data= [('a', 1), ('b', 2), ('a', 3)] result= {k: v for k, v in data} # 结果:{'a': 3, 'b': 2} 第一个'a'被覆盖
解决方案:
from collections import defaultdict dd=defaultdict(list) for k, v in data: dd[k].append(v)
陷阱2:条件顺序错误
# 错误:NameError: name 'v' is not defined result= {k: v for k, v in data if v>0 and k!='test'} # 正确:先确保v存在 result= {k: v for k, v in data if isinstance(v, int) and v>0}