【Python 字典(Dictionary)】
Python 中的字典(Dictionary)是最强大的键值对(key-value)数据结构,用于高效存储和访问数据。以下是字典的核心知识点:
一、基础特性
- 键值对存储:通过唯一键(Key)快速访问值(Value)
- 可变性:支持增删改查操作
- 无序性(Python 3.7+ 默认有序):元素无固定顺序,但插入顺序被保留
- 键的唯一性:键必须唯一且不可变(
int
/str
/tuple
等)person = {"name": "Alice","age": 30,"hobbies": ["reading", "coding"] }
二、创建字典
1. 直接定义
empty_dict = {} # 空字典
student = {"id": 101, "name": "Bob"}
2. 类型转换
dict(name="Charlie", age=25) # → {'name': 'Charlie', 'age': 25}
dict([("a", 1), ("b", 2)]) # → {'a': 1, 'b': 2}
3. 字典推导式
squares = {x: x**2 for x in range(5)} # → {0:0, 1:1, 2:4, 3:9, 4:16}
三、常用操作
1. 访问元素
person = {"name": "Alice", "age": 30}
print(person["name"]) # → "Alice"(直接访问)
print(person.get("age")) # → 30(安全访问)
print(person.get("job", "N/A")) # → "N/A"(默认值)
2. 增删改操作
# 增/改
person["city"] = "New York" # 添加新键值对
person["age"] = 31 # 修改现有值# 删
del person["city"] # 删除指定键
popped = person.pop("age") # 删除并返回值 → 31
person.clear() # 清空字典 → {}
3. 遍历字典
for key in person: # 遍历键print(key)for value in person.values(): # 遍历值print(value)for key, value in person.items(): # 遍历键值对print(f"{key} → {value}")
四、字典方法
方法 | 作用 | 示例 |
---|---|---|
keys() | 返回所有键的视图对象 | list(d.keys()) |
values() | 返回所有值的视图对象 | list(d.values()) |
items() | 返回键值对元组的视图对象 | list(d.items()) |
get(key, default) | 安全获取值 | d.get("age", 0) |
update(other) | 合并字典 | d.update({"city": "NY"}) |
pop(key) | 删除并返回指定键的值 | d.pop("age") |
popitem() | 删除并返回最后一个键值对 | d.popitem() |
setdefault(key) | 获取值,不存在则设置默认值 | d.setdefault("country", "US") |
五、高级用法
1. 合并字典
# Python 3.9+
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged = dict1 | dict2 # → {'a':1, 'b':3, 'c':4}# 通用方式
merged = {**dict1, **dict2}
2. 默认字典(defaultdict
)
from collections import defaultdictcounts = defaultdict(int) # 默认值为0
counts["apple"] += 1 # 自动初始化键
3. 有序字典(OrderedDict
)
from collections import OrderedDictordered = OrderedDict()
ordered["a"] = 1
ordered["b"] = 2 # 保持插入顺序
4. 嵌套字典
students = {"101": {"name": "Alice", "scores": [90, 85]},"102": {"name": "Bob", "scores": [78, 92]}
}
六、应用场景
-
配置管理:
config = {"db_host": "localhost","db_port": 3306,"debug_mode": True }
-
计数器:
from collections import defaultdictword_counts = defaultdict(int) for word in ["apple", "banana", "apple"]:word_counts[word] += 1
-
缓存系统:
cache = {} def get_data(key):if key not in cache:cache[key] = fetch_from_db(key) # 模拟数据库查询return cache[key]
-
数据转换:
# 列表转字典 users = [("id1", "Alice"), ("id2", "Bob")] user_dict = dict(users) # → {"id1": "Alice", "id2": "Bob"}
七、性能优化
-
键的哈希值:
- 优先使用不可变类型(如
int
/str
/tuple
)作为键 - 避免使用可变类型(如
list
/dict
)作为键
- 优先使用不可变类型(如
-
内存效率:
# 小整数键优化 d = {i: None for i in range(1000)} # 内存占用更小
-
快速查找:
- 字典的查找时间复杂度为 O(1),远快于列表的 O(n)
八、常见陷阱
-
可变默认参数:
def bad_init(data={}): # 危险!默认参数共享data["count"] = data.get("count", 0) + 1return data# 正确做法 def good_init(data=None):if data is None:data = {}data["count"] = data.get("count", 0) + 1return data
-
键的哈希冲突:
- 自定义对象作为键时需实现
__hash__()
和__eq__()
- 自定义对象作为键时需实现
-
视图对象特性:
d = {"a": 1, "b": 2} keys = d.keys() # 视图对象(动态反映字典变化) d["c"] = 3 print(keys) # → dict_keys(['a', 'b', 'c'])
通过合理使用字典,可以高效处理从简单键值存储到复杂数据映射的各种场景。实际应用中需注意键的选择和性能优化,并根据需求选择标准字典或专用扩展类(如 defaultdict
/OrderedDict
)。