# 常用数据结构之字典 ## 字典基础 字典(dictionary)以键值对形式存储数据,通过键快速找到对应的值,就像查《新华字典》——键是字,值是解释。 ```python person = { 'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区' } ``` ## 创建字典 ```python # 字面量 person = {'name': '王大锤', 'age': 55} # dict构造器 person = dict(name='王大锤', age=55) # zip压缩两个序列 d = dict(zip('ABC', '123')) # {'A': '1', 'B': '2', 'C': '3'} # 生成式 d = {x: x**3 for x in range(1, 6)} # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125} # 空字典 empty = {} # 这是字典 empty = dict() # 也是字典 ``` > **注意**:字典的键必须是不可变类型(`int`、`str`、`tuple`),不能用 `list`、`set`、`dict`。 ## 字典运算 ```python person = {'name': '王大锤', 'age': 55, 'height': 168} # 成员运算(判断键是否存在) print('name' in person) # True print('tel' in person) # False # 索引访问(键不存在会抛KeyError) print(person['name']) # 王大锤 # 添加/修改 person['age'] = 25 # 修改已有键 person['tel'] = '131xxxx' # 添加新键值对 ``` ## 字典方法 ```python person = {'name': '王大锤', 'age': 55, 'height': 178} # 安全获取(键不存在返回None或默认值) print(person.get('name')) # 王大锤 print(person.get('sex')) # None print(person.get('sex', '未知')) # 未知 # 获取键/值/键值对 print(person.keys()) # dict_keys(['name', 'age', 'height']) print(person.values()) # dict_values(['王大锤', 55, 178]) print(person.items()) # dict_items([('name', '王大锤'), ...]) # 遍历 for key, value in person.items(): print(f'{key}: {value}') # 更新/合并(Python 3.9+可用 |=) person.update({'age': 26, 'city': '成都'}) person |= {'city': '成都', 'city2': '北京'} # 删除 person.pop('age') # 删除并返回值 person.popitem() # 弹出最后一组键值对 person.clear() # 清空 del person['height'] # del关键字删除 ``` ## 应用实例 ### 统计字母出现频率 ```python sentence = input('请输入一段话: ') counter = {} for ch in sentence: if 'A' <= ch <= 'Z' or 'a' <= ch <= 'z': counter[ch] = counter.get(ch, 0) + 1 # 按出现次数排序输出 for key in sorted(counter, key=counter.get, reverse=True): print(f'{key} 出现了 {counter[key]} 次') ``` ### 字典生成式筛选 ```python stocks = { 'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ORCL': 48.44, 'ACN': 166.89, 'FB': 208.09 } # 筛选股价大于100的股票 high_price = {k: v for k, v in stocks.items() if v > 100} print(high_price) # {'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ACN': 166.89, 'FB': 208.09} ``` ## 总结 - 字典以键值对存储数据,键查找 O(1) 复杂度,非常高效 - 键必须是不可变类型,值可以是任意类型 - 常用方法:`get()` 安全访问、`update()` 合并、`pop()` 删除 - 字典生成式是筛选和转换数据的利器