HOWTO · Python

在 Python 中的循环内将键值对添加到字典中

了解如何在 Python 的循环中将键值对添加到字典中。

本页内容

字典赋值可以新增或更新条目:在循环中使用 dictionary[key] = value。如果键和值分别位于不同的可迭代对象中,可以在 for 循环里用 zip() 将它们配对。需要使用索引时,则可以采用 while 循环。

在循环中向字典添加键值对

先创建一个字典,然后在循环逐一访问每对键和值时,将对应的值赋给该键。值可以是不同类型的 Python 对象;键则必须可哈希。下面的示例将姓名与分数配对:

使用 zip() 配对键和值

每次迭代时,zip(keys, values) 都会从各个可迭代对象中生成一组对应的元素。运行下面的示例:

本节中的代码以及显示的标签或输出仍为英文。

keys = ["Ada", "Linus", "Grace"]
values = [98, 91, 100]

scores = {}
for key, value in zip(keys, values):
    scores[key] = value

print(scores)
{'Ada': 98, 'Linus': 91, 'Grace': 100}

赋值会将每个分数存到与之配对的姓名下。这种写法也适用于列表、函数或其他类型的值;只有字典的键必须满足可哈希要求。

需要索引时使用 while 循环

如果其他操作需要用到元素的位置,基于索引的循环会很有用。设置终止位置,并在每轮循环后递增索引:

本节中的代码以及显示的标签或输出仍为英文。

keys = ["Ada", "Linus", "Grace"]
values = [98, 91, 100]
scores = {}
index = 0
limit = min(len(keys), len(values))

while index < limit:
    scores[keys[index]] = values[index]
    index += 1

这里的 limit 可确保循环只访问两个列表中都存在的位置。对于一般的配对操作,for key, value in zip(keys, values) 写法更简洁,也不必自行管理索引。

处理输入长度不一致和已有键

默认情况下,zip() 会在最短的可迭代对象耗尽时停止。较长对象中未配对的元素会被忽略。如果每个键都必须有对应的值,请在循环前比较输入长度,并决定程序遇到长度不一致时应如何处理。

如果赋值时字典中已存在该键,新值会替换原值;字典不会因此创建具有相同键的第二个条目。如果要保留两个值,可以将集合用作值,并将新值追加其中。键必须可哈希,因此字符串、数字以及由可哈希元素组成的元组都可以作为键,而可变的列表和字典则不能。

打印结果并理解复杂度

可以使用 print(scores) 查看较小的字典,也可以遍历 scores.items(),逐项格式化键和值。对于示例中的这些值,简单字典的字符串表示是确定的。自定义对象的表示形式可能包含内存地址;如果需要可读且可重复的输出,应打印对象的特定属性。

对于 m 对键值对,循环会执行 m 次赋值。由于单次字典赋值的平均时间复杂度为 O(1),循环的平均时间复杂度为 O(m)。这是平均情况;发生哈希冲突时,个别赋值可能会更慢。输出字典最多包含 m 个不同的键,因此会额外占用 O(m) 空间。zip() 迭代器本身只占用常量级辅助空间。如果字典原本有 d 个条目,除非某个配对键替换了已有值,否则这些条目都会保留;最终字典的大小最多为 d + m。