如何用两个列表(键列表和值列表)创建一个 Python 字典?
用 zip() 配合 dict() 即可把键列表和值列表合并成字典:dict(zip(keys, values))。本文介绍基本用法、长度不一致的处理及字典推导式写法。
一行搞定:dict(zip(keys, values))。zip() 把两个列表按位置配对成元组流,dict() 再把它变成字典。
基本用法
keys = ['a', 'b', 'c']
values = [1, 2, 3]
dictionary = dict(zip(keys, values))
print(dictionary) # {'a': 1, 'b': 2, 'c': 3}
长度不一致时
zip() 默认以最短的列表为准,多余部分直接丢弃:
keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3]
dict(zip(keys, values)) # {'a': 1, 'b': 2, 'c': 3},'d' 被忽略
如果希望长度不一致就报错(避免静默丢数据),Python 3.10+ 可以用 zip(keys, values, strict=True)。
其他写法
# 字典推导式 + enumerate
d = {k: values[i] for i, k in enumerate(keys)}
# 需要默认值填充缺失值时(itertools.zip_longest)
from itertools import zip_longest
d = dict(zip_longest(keys, values, fillvalue=None))
常见问题(FAQ)
Q:zip 的结果能直接用吗,为什么外面要套 dict()?
A:zip() 返回的是迭代器,产出 ('a', 1) 这样的元组对;dict() 接收"键值对序列"构造字典,所以要套一层。
Q:键有重复会怎样?
A:后出现的值覆盖先出现的值,字典键本身唯一。
Q:想反过来把字典拆成两个列表呢?
A:list(d.keys()) 和 list(d.values()),且 Python 3.7+ 字典保持插入顺序,两者顺序一一对应。