字典操作
字典的创建
字典(dict)是Python中的映射类型,存储键值对(key-value pairs):
# 创建字典
person = {
"name": "小明",
"age": 25,
"city": "北京"
}
# 使用dict()构造函数
person2 = dict(name="小红", age=23, city="上海")
# 从键值对列表创建
pairs = [("name", "小刚"), ("age", 28)]
person3 = dict(pairs)
# 字典推导式
squares = {x: x**2 for x in range(1, 6)}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 空字典
empty = {}
empty2 = dict()
访问字典元素
person = {"name": "小明", "age": 25, "city": "北京"}
# 使用键访问
print(person["name"]) # 小明
# 使用get()方法(推荐)
print(person.get("name")) # 小明
print(person.get("phone")) # None(键不存在返回默认值)
print(person.get("phone", "未知")) # 未知
注意:直接用 [] 访问不存在的键会抛出 KeyError,而 get() 方法更安全。
修改字典
person = {"name": "小明", "age": 25}
# 添加新键值对
person["email"] = "xiaoming@example.com"
person["phone"] = "13800138000"
# 修改已有值
person["age"] = 26
# update() - 批量更新
person.update({"age": 27, "city": "北京"})
print(person)
# setdefault() - 设置默认值(仅当键不存在时)
person.setdefault("gender", "男")
print(person["gender"]) # 男
删除字典元素
person = {"name": "小明", "age": 25, "city": "北京", "email": "test@example.com"}
# del - 删除指定键
del person["email"]
# pop() - 删除并返回值
age = person.pop("age")
print(age) # 25
# pop() - 键不存在时返回默认值
phone = person.pop("phone", "无")
print(phone) # 无
# popitem() - 删除最后一个键值对
last = person.popitem()
print(last) # ('city', '北京')
# clear() - 清空字典
person.clear()
print(person) # {}
遍历字典
person = {"name": "小明", "age": 25, "city": "北京"}
# 遍历键
for key in person:
print(key, person[key])
# 遍历键(显式)
for key in person.keys():
print(key)
# 遍历值
for value in person.values():
print(value)
# 遍历键值对(推荐)
for key, value in person.items():
print(f"{key}: {value}")
字典方法总结
d = {"a": 1, "b": 2, "c": 3}
# keys() - 返回所有键的视图
print(d.keys()) # dict_keys(['a', 'b', 'c'])
# values() - 返回所有值的视图
print(d.values()) # dict_values([1, 2, 3])
# items() - 返回所有键值对的视图
print(d.items()) # dict_items([('a', 1), ('b', 2), ('c', 3)])
# copy() - 浅拷贝
d_copy = d.copy()
# fromkeys() - 创建新字典
keys = ["x", "y", "z"]
new_d = dict.fromkeys(keys, 0)
print(new_d) # {'x': 0, 'y': 0, 'z': 0}
字典推导式
# 基本推导式
squares = {x: x**2 for x in range(1, 6)}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 带条件过滤
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 键值交换
original = {"a": 1, "b": 2, "c": 3}
swapped = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}
# 从两个列表创建字典
keys = ["name", "age", "city"]
values = ["小明", 25, "北京"]
person = dict(zip(keys, values))
嵌套字典
# 学生信息系统
students = {
"001": {
"name": "小明",
"age": 20,
"scores": {"数学": 90, "英语": 85, "编程": 95}
},
"002": {
"name": "小红",
"age": 19,
"scores": {"数学": 88, "英语": 92, "编程": 80}
}
}
# 访问嵌套字典
print(students["001"]["name"]) # 小明
print(students["002"]["scores"]["英语"]) # 92
# 遍历嵌套字典
for sid, info in students.items():
print(f"学号: {sid}")
print(f" 姓名: {info['name']}")
print(f" 年龄: {info['age']}")
avg_score = sum(info["scores"].values()) / len(info["scores"])
print(f" 平均分: {avg_score:.1f}")
常用模式
词频统计
text = "hello world hello python hello world"
words = text.split()
# 方法1:使用get()
freq = {}
for word in words:
freq[word] = freq.get(word, 0) + 1
# 方法2:使用collections.Counter
from collections import Counter
freq = Counter(words)
print(freq) # Counter({'hello': 3, 'world': 2, 'python': 1})
数据分组
students = [
{"name": "小明", "grade": "A"},
{"name": "小红", "grade": "B"},
{"name": "小刚", "grade": "A"},
{"name": "小丽", "grade": "B"},
{"name": "小华", "grade": "C"}
]
# 按成绩分组
groups = {}
for student in students:
grade = student["grade"]
if grade not in groups:
groups[grade] = []
groups[grade].append(student["name"])
print(groups) # {'A': ['小明', '小刚'], 'B': ['小红', '小丽'], 'C': ['小华']}
# 使用defaultdict简化
from collections import defaultdict
groups = defaultdict(list)
for student in students:
groups[student["grade"]].append(student["name"])
配置管理
# 默认配置
default_config = {
"debug": False,
"host": "localhost",
"port": 8080,
"timeout": 30
}
# 用户配置
user_config = {
"debug": True,
"port": 3000
}
# 合并配置(用户配置覆盖默认配置)
config = {**default_config, **user_config}
print(config)
# {'debug': True, 'host': 'localhost', 'port': 3000, 'timeout': 30}
字典的性能
字典基于哈希表实现,查找、插入、删除的平均时间复杂度都是 O(1),非常高效。
import timeit
# 列表查找
large_list = list(range(1000000))
list_time = timeit.timeit("999999 in large_list", globals=globals(), number=100)
# 字典查找
large_dict = {i: True for i in range(1000000)}
dict_time = timeit.timeit("999999 in large_dict", globals=globals(), number=100)
print(f"列表查找: {list_time:.4f}秒")
print(f"字典查找: {dict_time:.4f}秒")
总结
字典是Python中最重要的数据结构之一,提供了高效的键值对存储和检索。掌握字典的创建、访问、修改、遍历和推导式后,你就能轻松处理各种关联数据。下一节我们将学习集合类型。