Python中dict的值为list的问题

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值