首页 > 解决方案 > 试图在无关文件中找到最小数字并打印它

问题描述

对于我正在处理的任务,我需要查看来自 OurWorldInData.org 的文件,该文件包含所有国家名称、代码、年份和西班牙流感的预期寿命信息,我需要提取最低的年份和国家名称和最高预期寿命,并为用户提供输入年份的方式以及显示该年预期寿命的程序。我不知道你们能提供多少帮助,因为如果你没有信息的 csv 文件,这有点难以模仿,但这是我现在的代码。

filename = 'Life_expectancy.csv'

with open(filename) as le_file:
    next(le_file)
    for line in le_file:

        line = line.strip().split(",")
        
        name = line[0]
        code = line[1]
        year = int(line[2])
        life_expectancy = float(line[3])
        
        min(life_expectancy) = min_life_expectancy

print(f'Name: {name}, Code: {code}, Year: {year}, Life Expectancy: {life_expectancy}')

我挣扎了很长时间,试图把我的头包裹在这个作业上,并决定尝试 min(life_expectancy),但得到一个错误,上面写着“SyntaxError:无法分配给函数调用”,我不知道这是什么方法。如果有人可以帮助我,我将不胜感激。

标签: listfilefor-loop

解决方案


所以我创建了一个名为life.csv. 很容易。它看起来像这样:

Name1,asd,1990,74,blah,blah,blah
Name2,bec,1923,41,blah,blah,blah
Name3,fre,1983,93,blah,blah,blah
Name4,jve,1066,23,blah,blah,blah
Name5,vne,1930,43,blah,blah,blah

一个很好的建议是创建一个用于提问的假人,但暂时不要担心!:-) 希望它看起来有点像你的顶部!

我已经修改了你的代码。如果您在诊断这种类型的循环时遇到问题,请记住,在您开始调试时,在每次迭代中使用 print() 语句是您的朋友!但是,我希望我并没有太抽象,所以你很乐意通过它并了解发生了什么:

rows = [] 
with open(filename) as le_file: 
    next(le_file) 
    for line in le_file: 
 
        line = line.strip().split(",") 
        rows.append(line) 

有了这个,您最终会得到一个名为 rows 的变量,其中包含您的拆分数据。

rows
[['Name1', 'asd', '1990', '74', 'blah', 'blah', 'blah'],
 ['Name2', 'bec', '1923', '41', 'blah', 'blah', 'blah'],
 ['Name3', 'fre', '1983', '93', 'blah', 'blah', 'blah'],
 ['Name4', 'jve', '1066', '23', 'blah', 'blah', 'blah'],
 ['Name5', 'vne', '1930', '43', 'blah', 'blah', 'blah']]

现在我们可以像这样提取年龄最小的行的索引:

ages = [row[3] for row in rows]
min_age_idx = ages.index(min(ages))

这将返回CSV 中最小年龄的第一个索引,您现在可以使用它来获取相关条目的详细信息:

details = rows[min_age_idx]
print('Name: {}, Code: {}, Year: {}, Life Expectancy: {}'.format(details[0], details[1], details[2], details[3])) 

现在,我很欣赏这不是最简洁的解决方案,但可以很好地说明您要实现的目标。您遇到的问题是,在您知道哪一行的年龄最小之前,您仍在阅读将条目分配给变量的文件。因此,在具有最小值的行之后的每个年龄都会重新分配您最终在打印语句中使用的变量。有很多方法可以解决问题或简化打印语句,包括使用pandas 等帮助库来读取 CSV,但我认为了解您的问题发生了什么很重要!

“无法分配给函数调用”的原因是因为 min() 是一个函数调用,它位于语句的左侧。如果你想用 min() 函数调用的结果分配一个变量,它看起来像:

my_min_value = min(values)

的左侧=是您要分配的内容,右侧是您要分配其结果的操作。

我真的希望这有助于为您解决问题!:-)


推荐阅读