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。