Python列表列表转字典:小CSV正常大CSV值异常问题
问题原因与解决方案
这问题我太熟了!核心原因就是Python字典的键唯一性在搞鬼~
为什么小样本正常、大样本出问题?
你用名字作为字典的键,但真实的16000行婴儿名字数据里,同一个名字肯定会重复出现:
- 同一个名字可能在不同年份有不同的使用次数记录
- 部分名字(比如Isabella其实也有男性使用的情况)会同时出现在男、女分类里
而Python字典的规则是:如果新的键已经存在,新的键值对会直接覆盖旧的。小样本里每个名字只出现一次,所以不会有覆盖;但大样本里,同一个名字的最后一次出现记录会把之前所有的都替换掉,这就是你看到{'Isabella': ['56', 'Boy']}的原因——这个结果只是Isabella在数据里最后一次出现的那条记录,之前的['42567', 'Girl']被覆盖没了。
怎么解决?
根据你的需求,有两种常见的修正方案:
方案1:用「名字+性别」作为复合键(区分同名不同性别的情况)
如果需要分别统计每个名字对应不同性别的数据,可以把名字和性别组合成元组作为键:
names = {} for d in data: # 用(name, gender)作为唯一键 key = (d[0], d[2]) names[key] = d[1]
最终会得到类似这样的字典:
{('Isabella', 'Girl'): '42567', ('Isabella', 'Boy'): '56', ('Jacob', 'Boy'): '42164'}
方案2:收集同一个名字的所有记录(保留历史/多性别数据)
如果需要保留同一个名字的所有相关记录,可以把字典的值设为列表,每次循环往列表里追加数据:
names = {} for d in data: name = d[0] # 如果名字不在字典里,先初始化一个空列表 if name not in names: names[name] = [] # 把当前记录的次数和性别追加到列表里 names[name].append(d[1:])
最终会得到类似这样的字典:
{'Isabella': [['42567', 'Girl'], ['56', 'Boy'], ['38000', 'Girl']], 'Jacob': [['42164', 'Boy']]}
内容的提问来源于stack exchange,提问作者Dragon-Ash
相关产品推荐
相关产品推荐

