常用数据结构之字典
# 常用数据结构之字典
## 字典基础
字典(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()` 删除
- 字典生成式是筛选和转换数据的利器