5.字典

0 阅读4分钟

1. 字典 (Dict) 基础

Python 中的字典类型用来存放“键值对 (key-value)”。通常,key 叫键,value 叫值,一组 keyvalue 叫做键值对。键值对之间用逗号隔开,用大括号 {} 包裹。

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. 四大内置数据结构对比总结

功能listtuplesetdict
可变类型
遍历有序✔(按添加顺序)
元素可重复✔(key不能,value可以)
对元素的要求必须可哈希key 必须可哈希