You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:27:54