← 返回首页
📖

字典操作

📂 python ⏱ 3 min 584 words

字典的创建

字典(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中最重要的数据结构之一,提供了高效的键值对存储和检索。掌握字典的创建、访问、修改、遍历和推导式后,你就能轻松处理各种关联数据。下一节我们将学习集合类型。