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}与其他推导式对比
常见应用场景
统计字符频率
代码示例
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())创建字典。
本文涉及AI创作
内容由AI创作,请仔细甄别