本文首发于我的个人博客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