本文首发于我的个人博客Suixin’s Blog
原文: https://suixinblog.cn/2019/02/python-dict-list-trouble.html  作者: Suixin

本质上,如果你设置一个dict的值为list,那么你大概率是想该dict的键能够映射多个值,并且能够不断的增添、删除或者修改。
Python中list的操作总是简单的,所以很多时候我都将容器设置为list,而在这次操作中,却踩了坑。

dict的值为list的坑

info_keys = ['NAME', 'AGE', 'SEX']
info_all = dict.fromkeys(info_keys, [])
info = {'NAME': 'Tom', 'AGE': 22, 'SEX': 'F'}
for key in info_keys:
    info_all[key].append(info[key])
print(info_all)

输出却为:

{'NAME': ['Tom', 22, 'F'], 'AGE': ['Tom', 22, 'F'], 'SEX': ['Tom', 22, 'F']}

为什么?

正确方法

info_keys = ['NAME', 'AGE', 'SEX']
info_all = {'NAME': [], 'AGE': [], 'SEX': []}
info = {'NAME': 'Tom', 'AGE': 22, 'SEX': 'F'}
for key in info_keys:
    info_all[key].append(info[key])
print(info_all)

或者

info_keys = ['NAME', 'AGE', 'SEX']
info_all = {}
info = {'NAME': 'Tom', 'AGE': 22, 'SEX': 'F'}
for key in info_keys:
    info_all.setdefault(key, []).append(info[key])
print(info_all)

均能正确输出结果:

{'NAME': ['Tom'], 'AGE': [22], 'SEX': ['F']}

所以,好像是dict.fromkeys()的锅??

参考

https://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p06_map_keys_to_multiple_values_in_dict.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐