Python CSV代码异常:指定区域正增长国家的最小/最大人口返回错误
问题:筛选指定区域人口净增长为正的国家,人口极值查询异常
我编写了一段Python代码,意图从CSV文件中筛选出指定区域内人口净增长(Net Change)为正的国家,并从中找出2020年人口(Population(2020))最少和最多的国家。但运行后,最小人口国家和最大人口国家均返回CSV文件中的第一个国家,与预期不符(预期应返回两个不同的对应国家)。
原代码如下:
import csv import math def main(file_name, region): data = [] with open(file_name, 'r') as file: reader = csv.DictReader(file) #Reads the CSV file and returns a list of dictionaries containing the data for row in reader: data.append(row) countries = [] for row in data: if row['Regions'] == region and float(row['Net Change']) > 0: #Returns a list of countries in a specific region with positive net change in population countries.append(row['Name']) #return countries min_population = math.inf max_population = -math.inf min_country = None max_country = None if row['Name'] in countries: #Returns the country with minimum and maximum population in the given list of countries population = int(row['Population(2020)']) if population < min_population: min_population = population min_country = row['Name'] if population > max_population: max_population = population max_country = row['Name'] return min_country, max_country
问题分析
原代码的核心问题是缩进错误和逻辑顺序混乱:
- 极值变量(
min_population、max_country等)的初始化和判断逻辑被错误缩进在if row['Regions'] == region...的代码块内,导致每遇到一个符合条件的国家就重置一次极值变量 return语句放在了遍历循环的内部,导致程序只处理第一个符合条件的国家就直接返回结果,后续数据完全没有被处理if row['Name'] in countries属于多余判断,当前行已经满足筛选条件才会被加入countries列表,无需重复验证
修复后的代码
import csv import math def main(file_name, region): # 初始化极值变量,放在循环外部避免重复重置 min_population = math.inf max_population = -math.inf min_country = None max_country = None with open(file_name, 'r') as file: reader = csv.DictReader(file) for row in reader: # 直接判断区域和净增长条件 if row['Regions'] == region and float(row['Net Change']) > 0: population = int(row['Population(2020)']) # 更新最小人口记录 if population < min_population: min_population = population min_country = row['Name'] # 更新最大人口记录 if population > max_population: max_population = population max_country = row['Name'] # 遍历完所有数据后再返回结果 return min_country, max_country
修复说明
- 将极值变量的初始化移到循环外部,确保整个遍历过程中变量只会被初始化一次
- 移除多余的
data和countries列表,直接在遍历CSV行时完成条件判断和极值更新,减少内存占用 - 将
return语句移到文件操作块外,确保所有符合条件的国家数据都被处理后再返回结果 - 删除无意义的
if row['Name'] in countries判断,简化逻辑
内容的提问来源于stack exchange,提问作者Rambes
相关产品推荐
相关产品推荐

