pin_drop当前位置:知识文库 ❯ 图文
Python字典fromkeys()方法
概述
fromkeys() 是字典的类方法,用于根据给定的键序列和默认值创建一个新字典。它常用于初始化字典,将一组键映射到相同的默认值。
语法
代码示例
dict.fromkeys(iterable[, value])返回值:新字典
基本用法
使用列表创建
代码示例
keys = ["name", "age", "city"]
d = dict.fromkeys(keys)
print(d)输出:
代码示例
{'name': None, 'age': None, 'city': None}指定默认值
代码示例
keys = ["name", "age", "city"]
d = dict.fromkeys(keys, "未知")
print(d)输出:
代码示例
{'name': '未知', 'age': '未知', 'city': '未知'}使用元组创建
代码示例
fields = ("x", "y", "z")
d = dict.fromkeys(fields, 0)
print(d)输出:
代码示例
{'x': 0, 'y': 0, 'z': 0}使用字符串创建
代码示例
d = dict.fromkeys("abc", 0)
print(d)输出:
代码示例
{'a': 0, 'b': 0, 'c': 0}可变默认值陷阱
当默认值是可变对象(如列表、字典)时,所有键会共享同一个对象:
代码示例
keys = ["a", "b", "c"]
d = dict.fromkeys(keys, [])
d["a"].append(1)
print(d)输出:
代码示例
{'a': [1], 'b': [1], 'c': [1]}提示:修改一个键的值,所有键都受影响!因为它们引用同一个列表对象。
正确方式:使用字典推导式
代码示例
keys = ["a", "b", "c"]
d = {k: [] for k in keys}
d["a"].append(1)
print(d)输出:
代码示例
{'a': [1], 'b': [], 'c': []}常见应用场景
初始化计数器
代码示例
items = ["apple", "banana", "cherry"]
counts = dict.fromkeys(items, 0)
print(counts)输出:
代码示例
{'apple': 0, 'banana': 0, 'cherry': 0}初始化配置
代码示例
options = ["debug", "verbose", "log"]
config = dict.fromkeys(options, False)
print(config)输出:
代码示例
{'debug': False, 'verbose': False, 'log': False}去重保留顺序
代码示例
data = ["a", "b", "a", "c", "b", "d"]
unique = list(dict.fromkeys(data))
print(unique)输出:
代码示例
['a', 'b', 'c', 'd']注意事项
提示:可变默认值陷阱:使用列表、字典等可变对象作为默认值时,所有键共享同一对象。应使用字典推导式替代。
提示:类方法:
fromkeys()是类方法,通过dict.fromkeys()调用,不是实例方法。
提示:值相同:所有键的值都是同一个对象(对于不可变类型无影响)。
小结
-
fromkeys(keys, value)根据键序列创建新字典 -
默认值为 None,可自定义
-
可变默认值会导致所有键共享同一对象,需用推导式替代
-
常用于初始化计数器、配置和去重
常见问题
fromkeys() 是实例方法还是类方法?
fromkeys() 是类方法,通过 dict.fromkeys() 调用,不需要先创建字典实例。
为什么 fromkeys() 使用可变默认值会有问题?
因为所有键都引用同一个对象实例。修改其中一个键的值,其他键也会受影响。应使用字典推导式为每个键创建独立对象。
fromkeys() 可以用于去重吗?
可以。利用字典键的唯一性,list(dict.fromkeys(data)) 可以在去重的同时保持原始顺序(Python 3.7+)。
fromkeys() 不指定默认值时值是什么?
默认值为 None。所有键的值都是 None。
练习1
使用 fromkeys() 创建一个学生成绩字典,键为学生姓名列表 ["Alice", "Bob", "Charlie"],初始成绩为 0。然后逐个更新每个学生的成绩。
练习2
编写一个函数 init_matrix_dict(rows, cols),使用 fromkeys() 和字典推导式创建一个行号为键、每行为零列表的字典矩阵。注意避免可变默认值陷阱。
本文涉及AI创作
内容由AI创作,请仔细甄别