
字典推导式是 Python 中简洁高效构建字典的利器,用好了能大幅减少冗余代码,提升可读性与执行效率。关键在于理解其结构、善用条件过滤、注意键的唯一性,并避免副作用。
基础语法与常见写法
字典推导式基本形式为:{key_expr: value_expr for item in iterable}。它等价于一个 for 循环加多次 dict[key] = value,但更紧凑。
- 从列表生成映射:
{x: x**2 for x in [2, 3, 4]}→{2: 4, 3: 9, 4: 16} - 从字符串构建字符索引:
{ch: i for i, ch in enumerate('abc')}→{'a': 0, 'b': 1, 'c': 2} - 注意键必须可哈希,
{[x]: x for x in [1]}会报TypeError
带条件过滤的推导式
可在推导式末尾添加 if 子句进行筛选,只对满足条件的元素生成键值对。
- 过滤偶数并平方:
{x: x**2 for x in range(10) if x % 2 == 0}→{0: 0, 2: 4, 4: 16, 6: 36, 8: 64} - 跳过空值或 None:
{k: v for k, v in data.items() if v is not None} - 支持单 if,不支持 if-else 作为过滤条件;若需分支赋值,把 if-else 放在 value_expr 或 key_expr 中(见下条)
键或值使用条件表达式(三元操作)
当需要根据条件动态决定键或值内容时,把 value if condition else other_value 写在对应表达式位置。
立即学习“Python免费学习笔记(深入)”;
- 统一小写键名,但保留原始值:
{k.lower(): v for k, v in {'Name': 'Alice', 'AGE': 30}.items()} - 值做类型转换或默认处理:
{k: int(v) if v.isdigit() else 0 for k, v in {'a': '12', 'b': 'xx'}.items()} - 键也可参与逻辑:
{(k if k.isalpha() else f'key_{i}'): v for i, (k, v) in enumerate(items)}
嵌套与组合场景实用技巧
复杂结构可通过多层推导或结合其他内置函数实现,但需权衡可读性。
- 反转字典(要求原值可哈希且唯一):
{v: k for k, v in original.items()} - 按某字段分组聚合(配合
defaultdict更清晰,但推导式可初筛):{k: [x for x in data if x['cat'] == k] for k in set(x['cat'] for x in data)} - 避免在推导式中调用有副作用的函数(如
print()、修改外部变量),因其执行时机和次数不易控制
字典推导式不是万能的,嵌套过深或逻辑复杂时,显式循环反而更易维护。核心是:保持表达式纯、键唯一、条件明确、不依赖执行顺序。










