Python案例如何用字典推导式赋值?

wen python案例 11

本文目录导读:

Python案例如何用字典推导式赋值?

  1. 基础字典推导式
  2. 条件过滤
  3. 值转换
  4. 键值互换
  5. 嵌套推导式
  6. 实用案例
  7. 性能对比

我来详细讲解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}秒")

字典推导式的主要优势:

  • 代码简洁:一行完成循环和赋值
  • 性能更好:比传统循环稍快
  • 可读性强:表达意图更加清晰
  • 灵活性高:支持条件过滤和值转换

注意:当逻辑过于复杂时,建议使用普通循环以保持可读性。

抱歉,评论功能暂时关闭!