字典(Dictionary) #

字典是Python中的映射类型,存储键值对的无序集合。

一、创建字典 #

1.1 基本创建 #

python
# 空字典
empty = {}
empty = dict()

# 带元素
person = {
    "name": "Tom",
    "age": 25,
    "city": "Beijing"
}

# 混合类型键值
mixed = {
    1: "one",
    "two": 2,
    (3, 4): "tuple key"
}

1.2 使用dict()函数 #

python
# 关键字参数
person = dict(name="Tom", age=25, city="Beijing")

# 键值对列表
person = dict([("name", "Tom"), ("age", 25)])

# 从两个列表创建
keys = ["name", "age", "city"]
values = ["Tom", 25, "Beijing"]
person = dict(zip(keys, values))

1.3 字典推导式 #

python
# 基本推导式
squares = {x: x ** 2 for x in range(5)}
print(squares)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 带条件
scores = {"Tom": 85, "Jerry": 60, "Alice": 90}
passed = {k: v for k, v in scores.items() if v >= 60}

1.4 fromkeys方法 #

python
# 创建具有相同值的字典
keys = ["a", "b", "c"]
d = dict.fromkeys(keys)
print(d)  # {'a': None, 'b': None, 'c': None}

d = dict.fromkeys(keys, 0)
print(d)  # {'a': 0, 'b': 0, 'c': 0}

二、访问元素 #

2.1 使用键访问 #

python
person = {"name": "Tom", "age": 25, "city": "Beijing"}

# 使用[]访问
print(person["name"])  # "Tom"
print(person["age"])   # 25

# 键不存在时报错
# print(person["email"])  # KeyError

2.2 使用get方法 #

python
person = {"name": "Tom", "age": 25}

# get方法:键不存在返回None
print(person.get("name"))     # "Tom"
print(person.get("email"))    # None
print(person.get("email", "无"))  # "无"(指定默认值)

2.3 检查键是否存在 #

python
person = {"name": "Tom", "age": 25}

# 使用in
print("name" in person)     # True
print("email" in person)    # False

# 使用not in
print("email" not in person)  # True

三、修改字典 #

3.1 添加和修改 #

python
person = {"name": "Tom", "age": 25}

# 添加新键值对
person["city"] = "Beijing"
print(person)  # {'name': 'Tom', 'age': 25, 'city': 'Beijing'}

# 修改已有键
person["age"] = 26
print(person)  # {'name': 'Tom', 'age': 26, 'city': 'Beijing'}

# update方法
person.update({"email": "tom@example.com", "age": 27})
print(person)

# update使用关键字参数
person.update(phone="12345678")

3.2 删除元素 #

python
person = {"name": "Tom", "age": 25, "city": "Beijing"}

# del:删除键值对
del person["city"]
print(person)  # {'name': 'Tom', 'age': 25}

# pop:删除并返回值
age = person.pop("age")
print(age)      # 25
print(person)   # {'name': 'Tom'}

# pop:键不存在时返回默认值
email = person.pop("email", "无")
print(email)  # "无"

# popitem:删除并返回最后一个键值对
person = {"name": "Tom", "age": 25}
item = person.popitem()
print(item)  # ('age', 25)

# clear:清空字典
person.clear()
print(person)  # {}

3.3 setdefault方法 #

python
person = {"name": "Tom", "age": 25}

# 键存在:返回值
name = person.setdefault("name", "Unknown")
print(name)  # "Tom"
print(person)  # {'name': 'Tom', 'age': 25}

# 键不存在:添加并返回默认值
email = person.setdefault("email", "none@example.com")
print(email)  # "none@example.com"
print(person)  # {'name': 'Tom', 'age': 25, 'email': 'none@example.com'}

四、遍历字典 #

4.1 遍历键 #

python
person = {"name": "Tom", "age": 25, "city": "Beijing"}

# 直接遍历(遍历键)
for key in person:
    print(key)

# 显式遍历键
for key in person.keys():
    print(key)

4.2 遍历值 #

python
person = {"name": "Tom", "age": 25, "city": "Beijing"}

for value in person.values():
    print(value)

4.3 遍历键值对 #

python
person = {"name": "Tom", "age": 25, "city": "Beijing"}

for key, value in person.items():
    print(f"{key}: {value}")

# 输出:
# name: Tom
# age: 25
# city: Beijing

五、字典方法 #

5.1 常用方法汇总 #

方法 描述
get(key[, default]) 获取值,键不存在返回默认值
keys() 返回所有键
values() 返回所有值
items() 返回所有键值对
pop(key[, default]) 删除并返回值
popitem() 删除并返回最后一个键值对
setdefault(key[, default]) 获取值,不存在则添加
update([other]) 更新字典
clear() 清空字典
copy() 浅拷贝
fromkeys(iterable[, value]) 创建新字典

5.2 copy方法 #

python
original = {"name": "Tom", "scores": [85, 90, 88]}

# 浅拷贝
copied = original.copy()
copied["name"] = "Jerry"
print(original["name"])  # "Tom"(不影响原字典)

# 但嵌套对象是引用
copied["scores"].append(95)
print(original["scores"])  # [85, 90, 88, 95](受影响)

# 深拷贝
import copy
deep_copied = copy.deepcopy(original)
deep_copied["scores"].append(100)
print(original["scores"])  # [85, 90, 88, 95](不受影响)

六、字典嵌套 #

6.1 嵌套字典 #

python
# 嵌套字典
students = {
    "Tom": {"age": 25, "city": "Beijing"},
    "Jerry": {"age": 30, "city": "Shanghai"}
}

# 访问嵌套值
print(students["Tom"]["city"])  # "Beijing"

# 使用get安全访问
print(students.get("Tom", {}).get("city"))  # "Beijing"
print(students.get("Alice", {}).get("city"))  # None

6.2 字典列表 #

python
# 字典组成的列表
students = [
    {"name": "Tom", "age": 25},
    {"name": "Jerry", "age": 30},
    {"name": "Alice", "age": 28}
]

# 遍历
for student in students:
    print(f"{student['name']}: {student['age']}")

七、字典排序 #

7.1 按键排序 #

python
scores = {"Tom": 85, "Jerry": 90, "Alice": 88}

# 按键排序
sorted_by_key = dict(sorted(scores.items()))
print(sorted_by_key)  # {'Alice': 88, 'Jerry': 90, 'Tom': 85}

7.2 按值排序 #

python
scores = {"Tom": 85, "Jerry": 90, "Alice": 88}

# 按值排序(升序)
sorted_by_value = dict(sorted(scores.items(), key=lambda x: x[1]))
print(sorted_by_value)  # {'Tom': 85, 'Alice': 88, 'Jerry': 90}

# 按值排序(降序)
sorted_by_value_desc = dict(sorted(scores.items(), key=lambda x: x[1], reverse=True))
print(sorted_by_value_desc)  # {'Jerry': 90, 'Alice': 88, 'Tom': 85}

八、字典合并 #

8.1 使用update #

python
a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}

a.update(b)
print(a)  # {'x': 1, 'y': 3, 'z': 4}(b覆盖a的相同键)

8.2 使用 ** 解包(Python 3.5+) #

python
a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}

c = {**a, **b}
print(c)  # {'x': 1, 'y': 3, 'z': 4}(b覆盖a的相同键)
print(a)  # {'x': 1, 'y': 2}(a不变)

8.3 使用 | 运算符(Python 3.9+) #

python
a = {"x": 1, "y": 2}
b = {"y": 3, "z": 4}

# 合并(返回新字典)
c = a | b
print(c)  # {'x': 1, 'y': 3, 'z': 4}

# 原地合并
a |= b
print(a)  # {'x': 1, 'y': 3, 'z': 4}

九、字典应用场景 #

9.1 计数器 #

python
# 统计字符频率
text = "hello world"
counter = {}
for char in text:
    counter[char] = counter.get(char, 0) + 1
print(counter)  # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

# 使用collections.Counter
from collections import Counter
counter = Counter(text)
print(counter)  # Counter({'l': 3, 'o': 2, ...})

9.2 分组 #

python
# 按条件分组
from collections import defaultdict
students = [
    {"name": "Tom", "grade": "A"},
    {"name": "Jerry", "grade": "B"},
    {"name": "Alice", "grade": "A"},
    {"name": "Bob", "grade": "C"}
]

groups = defaultdict(list)
for student in students:
    groups[student["grade"]].append(student["name"])

print(dict(groups))  # {'A': ['Tom', 'Alice'], 'B': ['Jerry'], 'C': ['Bob']}

9.3 缓存/记忆化 #

python
# 使用字典缓存计算结果
cache = {}

def fibonacci(n):
    if n in cache:
        return cache[n]
    if n <= 1:
        return n
    cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
    return cache[n]

十、特殊字典类型 #

10.1 defaultdict #

python
from collections import defaultdict

# 默认值为列表
d = defaultdict(list)
d["fruits"].append("apple")
d["fruits"].append("banana")
print(d)  # {'fruits': ['apple', 'banana']}

# 默认值为整数
counter = defaultdict(int)
for char in "hello":
    counter[char] += 1
print(counter)  # {'h': 1, 'e': 1, 'l': 2, 'o': 1}

10.2 OrderedDict #

python
from collections import OrderedDict

# 保持插入顺序(Python 3.7+普通字典也保持顺序)
od = OrderedDict()
od["a"] = 1
od["b"] = 2
od["c"] = 3
print(od)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# move_to_end
od.move_to_end("a")
print(od)  # OrderedDict([('b', 2), ('c', 3), ('a', 1)])

10.3 ChainMap #

python
from collections import ChainMap

# 链接多个字典
defaults = {"theme": "dark", "language": "en"}
user_settings = {"theme": "light"}

config = ChainMap(user_settings, defaults)
print(config["theme"])     # "light"(从user_settings获取)
print(config["language"])  # "en"(从defaults获取)

十一、总结 #

操作 方法/语法 示例
创建 {}, dict() {"a": 1}
访问 [], get() d["a"], d.get("a")
添加/修改 [], update() d["b"] = 2
删除 del, pop() del d["a"]
遍历 keys(), values(), items() for k, v in d.items()

特点:

  • 无序(Python 3.7+保持插入顺序)
  • 键唯一:重复键会覆盖
  • 键必须可哈希:不可变类型
  • 值可以是任意类型
最后更新:2026-03-16