Пытаемся найти минимальное число в постороннем файле и распечатать его - PullRequest
0 голосов
/ 11 июля 2020

Для задания, над которым я работаю, мне нужно go через файл с сайта OurWorldInData.org, в котором есть информация обо всех странах с названиями, кодами, годами и ожидаемой продолжительностью жизни с гриппом в Испании и название страны, которая имела самую низкую и самую высокую продолжительность жизни, а также предлагала пользователю возможность ввести год и программу для отображения ожидаемой продолжительности жизни с этого года. Я не знаю, сколько помощи yall сможет предложить, так как это довольно сложно подражать, если у вас нет файла 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}')

I очень долго боролся, пытаясь понять это назначение, и решил просто попробовать min (life_expectancy), но получил ошибку, которая гласит «SyntaxError: не удается назначить вызов функции», и я не знаю, что это значит . Если бы кто-нибудь мог мне помочь, я был бы очень признателен.

1 Ответ

1 голос
/ 11 июля 2020

Итак, я создал небольшой фиктивный файл данных с именем 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

Хороший совет - создать манекен, чтобы задавать вопросы, но пока не беспокойтесь об этом! :-) Надеюсь, это немного похоже на вашу верхнюю часть!

Я исправил ваш код. Если у вас возникли проблемы с диагностикой этого типа l oop, помните, что наличие операторов 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)

Левая часть = - это то, что вы назначаете, правая часть - это операция, результат которой вы хотите присвоить ей.

Я действительно надеюсь, что это поможет вам прояснить ситуацию! : -)

...