pin_drop当前位置:知识文库 ❯ 图文

Python字典推导式

概述

字典推导式(Dictionary Comprehension)是一种简洁高效地创建字典的语法。它用一行代码就能完成字典的创建、过滤和转换操作,是 Python 最具特色的语法之一。相比传统的循环方式,推导式更简洁且性能更好。


语法

代码示例

{key_expr: value_expr for item in iterable}
{key_expr: value_expr for item in iterable if condition}

返回值:新字典


基本用法

从列表创建字典

代码示例

numbers = [1, 2, 3, 4, 5]
squares = {n: n**2 for n in numbers}
print(squares)

输出:

代码示例

{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

从字典创建新字典

代码示例

original = {"a": 1, "b": 2, "c": 3}
doubled = {k: v * 2 for k, v in original.items()}
print(doubled)

输出:

代码示例

{'a': 2, 'b': 4, 'c': 6}

键值对互换

代码示例

original = {"a": 1, "b": 2, "c": 3}
inverted = {v: k for k, v in original.items()}
print(inverted)

输出:

代码示例

{1: 'a', 2: 'b', 3: 'c'}

带条件过滤的推导式

过滤值

代码示例

numbers = {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
even = {k: v for k, v in numbers.items() if v % 2 == 0}
print(even)

输出:

代码示例

{2: 4, 4: 16}

条件表达式

代码示例

scores = {"Alice": 85, "Bob": 92, "Charlie": 78}
status = {k: ("及格" if v >= 80 else "不及格") for k, v in scores.items()}
print(status)

输出:

代码示例

{'Alice': '及格', 'Bob': '及格', 'Charlie': '不及格'}

嵌套推导式

代码示例

matrix = {(i, j): i * j for i in range(1, 4) for j in range(1, 4)}
print(matrix)

输出:

代码示例

{(1, 1): 1, (1, 2): 2, (1, 3): 3, (2, 1): 2, (2, 2): 4, (2, 3): 6, (3, 1): 3, (3, 2): 6, (3, 3): 9}

与其他推导式对比

推导式类型 语法 返回值
列表推导式 [expr for x in iterable] 列表
集合推导式 {expr for x in iterable} 集合
字典推导式 {k: v for x in iterable} 字典
生成器表达式 (expr for x in iterable) 生成器

常见应用场景

统计字符频率

代码示例

text = "hello world"
freq = {char: text.count(char) for char in set(text) if char != ' '}
print(freq)

输出:

代码示例

{'h': 1, 'e': 1, 'l': 3, 'o': 2, 'w': 1, 'r': 1, 'd': 1}

过滤无效数据

代码示例

data = {"a": 1, "b": None, "c": 3, "d": "", "e": 5}
valid = {k: v for k, v in data.items() if v}
print(valid)

输出:

代码示例

{'a': 1, 'c': 3, 'e': 5}

合并多个字典

代码示例

dicts = [{"a": 1}, {"b": 2}, {"c": 3}]
merged = {k: v for d in dicts for k, v in d.items()}
print(merged)

输出:

代码示例

{'a': 1, 'b': 2, 'c': 3}

注意事项

提示:可读性优先:推导式不应过于复杂,超过两层循环或条件时建议使用传统循环。

提示:键唯一性:如果推导式中生成的键有重复,后面的值会覆盖前面的值。

提示:性能优势:推导式通常比等效的 for 循环更快,因为它在 C 层面优化过。


小结

  • 字典推导式语法:{key: value for item in iterable}

  • 支持条件过滤和条件表达式

  • 比传统循环更简洁且性能更好

  • 适合数据转换、过滤和统计等场景


常见问题

字典推导式与 for 循环相比有什么优势?

字典推导式更简洁,一行代码即可完成创建、过滤和转换。且在 C 层面优化过,性能通常比等效的 for 循环更好。

字典推导式中键重复会怎样?

如果推导式生成的键有重复,后面的值会覆盖前面的值,最终只保留最后一个值。

何时不应该使用推导式?

当推导式过于复杂(超过两层循环或多个条件)时,应使用传统 for 循环以保持代码可读性。可读性永远优先于简洁性。

字典推导式支持 else 条件吗?

字典推导式本身不支持 else,但可以在值表达式中使用三元条件表达式(value_if_true if condition else value_if_false)来实现类似效果。

练习1

使用字典推导式将一个字符串中的单词及其长度组成字典。例如 "hello world python"{"hello": 5, "world": 5, "python": 6}

练习2

给定两个列表 keys = ["name", "age", "city"]values = ["Alice", 25, "Beijing"],使用字典推导式(结合 zip())创建字典。

标签: 字典推导式 推导式 数据转换 过滤 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python字典clear()方法 下一篇: Python嵌套字典

poll相关推荐