当前位置: 首页 > news >正文

有关字典的函数

有关字典的函数

字典的创建

点击查看代码
d = {}               # 空字典
d = dict()           # 空字典
d = {"a":1, "b":2}   # 直接定义
d = dict(a=1, b=2)   # 用 dict() 定义

查找
d[key]
获取值,不存在会报错

点击查看代码
d = {"a":1}
print(d["a"])  # 1
# d["x"]       # KeyError
d.get(key, default=None) 获取值,不存在不报错,返回默认值
点击查看代码
d.get("a")     # 1
d.get("x", 0)  # 0
d.setdefault(key, default=None) 有就返回,没有就添加,并返回值
点击查看代码
d.setdefault("a", 10)  # 1(已存在)
d.setdefault("x", 10)  # 10(添加成功)
print(d)  # {'a':1, 'x':10}

增 / 改

  1. 直接赋值
点击查看代码
d["c"] = 3    # 新增
d["a"] = 100  # 修改
2. d.update(字典/可迭代对象)
点击查看代码
d.update({"b":2, "c":3})
删 1. del d[key] 删除键值对,不存在报错
点击查看代码
del d["a"]
2. d.pop(key, default) 删除并返回被删除的值
点击查看代码
d.pop("a")       # 删除并返回 1
d.pop("x", 0)    # 不存在不报错,返回 0
3. d.popitem() 删除最后插入的键值对(Python 3.7+ 有序)
点击查看代码
d.popitem()  # 返回 (key, value)
4. d.clear() 清空字典
点击查看代码
d.clear()  # 变成空字典

获取所有键、值、键值对

  1. d.keys() 获取所有键
点击查看代码
d.keys()  # dict_keys(['a', 'b'])
2. d.values() 获取所有值
点击查看代码
d.values()  # dict_values([1, 2])
3. d.items() 获取所有 **(键,值)** 对(遍历神器)
点击查看代码
for k, v in d.items():print(k, v)

复制字典

  1. d.copy()
    浅拷贝(常用,安全)
点击查看代码
new_d = d.copy()
字典推导式
点击查看代码
# 快速生成字典
d = {k:v for k, v in [("a",1), ("b",2)]}# 条件筛选
d = {k:v for k,v in d.items() if v>0}
其他内置函数(可操作 dict) len(d) # 长度 key in d # 判断键是否存在 max(d) # 最大键 min(d) # 最小键 list(d) # 转成键列表 sorted(d) # 键排序

冷门但官方存在的方法(了解即可)

  1. classmethod dict.fromkeys(seq, value) 用序列创建字典,所有键对应同一个值
    d = dict.fromkeys(["a","b"], 0) #
  2. d.contains(key)
    等价于 key in d
  3. d.len()
    等价于 len(d)

fromkeys() 是字典类的静态方法(类方法),不是实例方法.
作用:用一个可迭代对象(列表、元组、字符串、集合等)作为所有键,统一指定一个默认值,快速批量创建新字典。

点击查看代码
dict.fromkeys(iterable, value=None)
二、参数说明 iterable(必传) 可迭代对象,里面每一个元素都会成为新字典的 key。 value(可选,默认 None) 所有键对应的统一值,不传则默认值为 None。 重点:所有键共用同一个 value。

三、基础示例

  1. 只传可迭代对象,值默认为 None
点击查看代码
# 列表作为键
d1 = dict.fromkeys(["name", "age", "gender"])
print(d1)
# {'name': None, 'age': None, 'gender': None}# 字符串作为可迭代对象(字符逐个当键)
d2 = dict.fromkeys("abc")
print(d2)
# {'a': None, 'b': None, 'c': None}# 元组作为键
d3 = dict.fromkeys(("k1", "k2"))
print(d3)
# {'k1': None, 'k2': None}
2. 传入自定义统一值
点击查看代码
# 所有键值都是 0
d = dict.fromkeys(["a", "b", "c"], 0)
print(d)
# {'a': 0, 'b': 0, 'c': 0}# 统一值为字符串
d2 = dict.fromkeys([1, 2, 3], "未知")
print(d2)
# {1: '未知', 2: '未知', 3: '未知'}

四、核心坑点(高频易错)
坑 1:值为可变对象(列表、字典)时,所有键共享同一个对象
这是最容易踩的雷。

点击查看代码
# 错误示范:value 是列表(可变类型)
d = dict.fromkeys(["x", "y", "z"], [1, 2])
print(d)
# {'x': [1, 2], 'y': [1, 2], 'z': [1, 2]}# 修改其中一个值,全部跟着变!
d["x"].append(3)
print(d)
# {'x': [1, 2, 3], 'y': [1, 2, 3], 'z': [1, 2, 3]}
原因:三个 key 指向同一块内存地址的列表。 解决方案:让每个键拥有独立可变对象 用字典推导式替代 fromkeys:
点击查看代码
keys = ["x", "y", "z"]
d = {k: [1, 2] for k in keys}d["x"].append(3)
print(d)
# {'x': [1, 2, 3], 'y': [1, 2], 'z': [1, 2]}

坑 2:可迭代对象中有重复元素,自动去重
字典键唯一,重复元素只会保留一个:

点击查看代码
d = dict.fromkeys([1, 1, 2, 2, 3], 100)
print(d)
# {1: 100, 2: 100, 3: 100}

坑 3:不能用实例调用?可以,但不推荐

点击查看代码
d = {"a": 1}
res = d.fromkeys([1,2,3])  # 能运行,但语义奇怪
print(res)  # {1: None, 2: None, 3: None}
规范写法:统一用 dict.fromkeys()(类名调用)。

五、常用实战场景
场景 1:快速初始化一批状态 / 计数器

点击查看代码
# 初始化多个账号,状态都为 False
users = dict.fromkeys(["user1", "user2", "user3"], False)
print(users)# 初始化计数器,全部归 0
count = dict.fromkeys("abcd", 0)
print(count)
场景 2:把列表快速转为 “键 - 默认值” 字典
点击查看代码
fruit_list = ["苹果", "香蕉", "橙子"]
fruit_dict = dict.fromkeys(fruit_list, 0)
print(fruit_dict)