1. 字典 (Dict) 基础
Python 中的字典类型用来存放“键值对 (key-value)”。通常,key 叫键,value 叫值,一组 key 和 value 叫做键值对。键值对之间用逗号隔开,用大括号 {} 包裹。
d = {
'da': '搭、答、达、妲、打、大',
'yong': '佣、拥、永、勇、咏、用'
}
print(len(d)) # 获取键值对的数量
print(type(d)) # <class 'dict'>
print('da' in d) # 判断是否存在某个 key: True
2. 创建字典对象
其实就{}和dict函数两种
# 1. 直接通过大括号创建
d = {
'name': '小码哥',
'age': 18
}
# 2. 通过 dict() 函数创建
d = dict(name='小码哥', age=18, height=1.9)
# 3. 创建空字典 (两种方式等价)
d1 = {}
d2 = dict()
注意: 空集合必须用 set(),因为 {} 是用来创建空字典的。
3. 根据 key 获取 value
可以通过 d[key] 或 d.get(key) 来获取值:
d = {'name': '小码哥', 'age': 18}
# d[key]
print(d['name']) # '小码哥'
# print(d['money']) # 如果 key 不存在,会报错 (KeyError)
# d.get(key)
print(d.get('age')) # 18
print(d.get('money')) # 如果 key 不存在,不会报错,返回 None
# d.get(key, x)
# 如果 key 不存在,就返回默认值 x
print(d.get('money', 120)) # 返回 120
补充:关于 None
None意为:空、没有、不存在,类似于js中的null,undefined,他取bool值是 False,判断一个数据是不是None,不能直接用 == ,都要用is None或者is not None
4. 字典 key 的特点
- 字典的 key 自带去重功能:不允许存在两个值相等的 key,这一特点类似于集合
set。如果重复赋值,后面的会覆盖前面的。 - 字典的 value 可以重复:允许出现值相等的 value。
- 字典的 key 必须是可哈希的 (hashable):比如
int,str,tuple等。列表list不能作为字典的 key
5. 添加与修改 key-value
直接赋值
d = {'name': '小码哥'}
d['age'] = 18 # key 不存在,则是添加
d['name'] = 'MJ' # key 已存在,则是修改覆盖
update 方法
d.update(x):将 x 中的键值对合并到 d 中。如果有相同的 key,则进行修改覆盖。有点像是mix的意思。
d1 = {'name': 'MJ'}
d2 = {'age': 18, 'name': '小码哥'}
d1.update(d2)
print(d1) # {'name': '小码哥', 'age': 18}
# 也可以这样传参合并
d1.update(height=1.9, age=20)
setdefault 方法
当只想新增键值对,不想修改键值对时,可以考虑使用setdefault方法
特点: d.setdefault(key, value):如果 key 不存在,就添加这个键值对并返回 value;如果 key 已经存在,则不做任何修改并返回原 value。只能用来新增,不能用来修改已有键值对,如果省略 value,则相当于 d.setdefault(key, None)。
6. 删除 key-value
d.pop(key):删除指定的 key 并返回它对应的 value。如果 key 不存在会报错KeyError。del d[key]:使用del关键字删除,key 不存在也会报错。d.popitem():删除 1 个键值对,并返回一个元组(key, value)。它的删除顺序和添加的顺序是相反的 (后进先出)。d.clear():清空字典中的所有键值对。
7. 遍历字典
从 Python 3.7 开始,字典的遍历顺序和 key 的添加顺序一致。
- 遍历key
- 遍历 value
- 同时遍历key和value
d = {'name': '小码哥', 'age': 18, 'height': 1.9}
# 1. 遍历所有 key (默认)
for key in d:
print(key, d[key])
# 或者
for key in d.keys():
print(key)
# 2. 只遍历所有的 value
for v in d.values():
print(v)
# 3. 同时遍历 key 和 value (最常用)
for k, v in d.items():
print(k, v)
# 4. 直接遍历 items 返回的是元组
for i in d.items():
print(i) # 例如 ('name', '小码哥')
8. 高级用法
统计字数 (利用 get() 的绝佳场景)
d = {}
text = "小码哥大老哈"
for c in text:
# 每次拿到字符,去字典里取旧的次数并+1。如果第一次出现取不到,就默认给 0 再 +1
d[c] = d.get(c, 0) + 1
format_map 字符串格式化
字典可以直接配合 format_map 进行字符串插值,这个format_map有点意思
d = {'name': 'MJ', 'age': 18}
print('我的名字是{name},今年{age}岁'.format_map(d))
字典推导式
# 生成 d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
d = {i: i ** 2 for i in range(5)}
9. 四大内置数据结构对比总结
| 功能 | list | tuple | set | dict |
|---|---|---|---|---|
| 可变类型 | ✔ | ❌ | ✔ | ✔ |
| 遍历有序 | ✔ | ✔ | ❌ | ✔(按添加顺序) |
| 元素可重复 | ✔ | ✔ | ❌ | ✔(key不能,value可以) |
| 对元素的要求 | 无 | 无 | 必须可哈希 | key 必须可哈希 |