本文目录导读:

我来详细讲解Python中字典推导式的几种使用方式:
基础字典推导式
从列表创建字典
# 从两个列表创建字典
keys = ['a', 'b', 'c']
values = [1, 2, 3]
# 使用zip和字典推导式
result = {k: v for k, v in zip(keys, values)}
print(result) # {'a': 1, 'b': 2, 'c': 3}
# 从一个列表创建键值对
numbers = [1, 2, 3, 4, 5]
squares = {num: num**2 for num in numbers}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
条件过滤
# 只保留偶数
numbers = [1, 2, 3, 4, 5, 6]
even_squares = {num: num**2 for num in numbers if num % 2 == 0}
print(even_squares) # {2: 4, 4: 16, 6: 36}
# 带条件的复杂过滤
scores = {'小明': 85, '小红': 92, '小刚': 78, '小李': 95}
passed = {name: score for name, score in scores.items() if score >= 80}
print(passed) # {'小明': 85, '小红': 92, '小李': 95}
值转换
# 转换值类型
strings = ['1', '2', '3', '4']
int_dict = {s: int(s) for s in strings}
print(int_dict) # {'1': 1, '2': 2, '3': 3, '4': 4}
# 复杂转换
temperatures_c = {'北京': 20, '上海': 25, '广州': 30}
temperatures_f = {city: c * 9/5 + 32 for city, c in temperatures_c.items()}
print(temperatures_f) # {'北京': 68.0, '上海': 77.0, '广州': 86.0}
键值互换
# 交换字典的键和值
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {v: k for k, v in original.items()}
print(swapped) # {1: 'a', 2: 'b', 3: 'c'}
# 注意:如果值不唯一,后面的会覆盖前面的
original2 = {'a': 1, 'b': 1, 'c': 2}
swapped2 = {v: k for k, v in original2.items()}
print(swapped2) # {1: 'b', 2: 'c'} 'a'被覆盖了
嵌套推导式
# 嵌套列表推导式创建字典
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
position_dict = {i: {j: matrix[i][j] for j in range(len(matrix[i]))} for i in range(len(matrix))}
print(position_dict)
# {0: {0: 1, 1: 2, 2: 3}, 1: {0: 4, 1: 5, 2: 6}, 2: {0: 7, 1: 8, 2: 9}}
实用案例
统计字符串中字符出现次数
text = "hello world"
char_count = {char: text.count(char) for char in set(text)}
print(char_count) # {'w': 1, 'l': 3, 'r': 1, 'd': 1, 'h': 1, 'e': 1, 'o': 2, ' ': 1}
数据清洗和处理
# 清洗字典数据
raw_data = {'a': None, 'b': 10, 'c': 0, 'd': '', 'e': 'hello'}
cleaned = {k: v for k, v in raw_data.items() if v}
print(cleaned) # {'b': 10, 'c': 0, 'e': 'hello'}
# 注意:0和空字符串也会被过滤掉
# 保留特定条件
filtered = {k: v for k, v in raw_data.items() if v is not None}
print(filtered) # {'b': 10, 'c': 0, 'd': '', 'e': 'hello'}
文件扩展名分组
files = ['image.jpg', 'doc.pdf', 'photo.jpg', 'notes.txt', 'script.py']
extension_groups = {file.split('.')[-1]: [] for file in files}
for file in files:
ext = file.split('.')[-1]
extension_groups[ext].append(file)
print(extension_groups)
# {'jpg': ['image.jpg', 'photo.jpg'], 'pdf': ['doc.pdf'], 'txt': ['notes.txt'], 'py': ['script.py']}
性能对比
import time
# 传统方法 vs 字典推导式
data = range(1000000)
# 传统循环
start = time.time()
result1 = {}
for i in data:
result1[i] = i * 2
print(f"传统循环: {time.time() - start:.4f}秒")
# 字典推导式
start = time.time()
result2 = {i: i*2 for i in data}
print(f"字典推导式: {time.time() - start:.4f}秒")
字典推导式的主要优势:
- 代码简洁:一行完成循环和赋值
- 性能更好:比传统循环稍快
- 可读性强:表达意图更加清晰
- 灵活性高:支持条件过滤和值转换
注意:当逻辑过于复杂时,建议使用普通循环以保持可读性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播