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

从CSV提取各国年度GDP时字典数据重复问题排查

问题分析与修复

你的代码出现数据混合的核心问题是**output列表的作用域错误**,让我给你拆解一下:

错误原因

你在for x in country_list:循环的外部定义了output = [],这意味着所有国家都会共享同一个列表对象。处理第一个国家时,它的GDP数据被添加到这个列表里;处理第二个国家时,新的数据又继续追加到同一个列表中,最后每个国家的条目都指向这个被填满所有数据的列表,自然就出现了数据混合的情况。

修复方案

把output列表的初始化放到每个国家的循环内部,这样每个国家都会拥有独立的列表来存储自己的年度GDP数据。

修正后的代码

import csv

def read_csv_as_nested_dict(filename, keyfield, separator, quote):
    table = {}
    with open(filename, newline='') as csvfile:
        csvreader = csv.DictReader(csvfile, delimiter=separator, quotechar=quote)
        for row in csvreader:
            rowid = row[keyfield]
            table[rowid] = row
    return table

def build_plot_dict(gdpinfo, country_list):
    merge = {}
    gdp_dict = read_csv_as_nested_dict(gdpinfo["gdpfile"], gdpinfo["country_name"], gdpinfo["separator"], gdpinfo["quote"])
    maxyear = gdpinfo['max_year']
    minyear = gdpinfo['min_year']
    
    for x in country_list:
        # 每个国家单独初始化自己的output列表
        output = []
        for my_key, my_val in gdp_dict[x].items():
            try:
                # 优化:把数值判断和年份范围整合到同一条件
                if my_key.isnumeric() and (minyear <= int(my_key) <= maxyear):
                    try:
                        # 验证并转换GDP数值
                        gdp_value = float(my_val)
                        my_tup = (int(my_key), gdp_value)
                        output.append(my_tup)
                    except ValueError:
                        continue
            except ValueError:
                continue
        # 对当前国家的年度数据按年份排序
        output.sort(key=lambda t: t[0])
        merge[x] = output
    return merge

额外优化说明

我还顺便修正了代码里的两个无效逻辑:

  1. 之前的my_key.isnumeric() == True写法冗余,且没有实际作为判断条件使用,现在整合到了有效的分支判断中。
  2. my_val == True这个判断完全无效,改成了直接尝试转换为浮点数,确保只保留有效的GDP数值。

现在运行你的调用代码,就能得到预期的输出结果啦。

内容的提问来源于stack exchange,提问作者César Chávez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:38