#python #for-loop
#python #для цикла
Вопрос:
Я решаю проблему, в которой мне нужно использовать данные из файла csv, чтобы определить, какой фильм имеет наибольшее общее количество брутто за каждый год.
У меня уже есть dict ‘year’ для каждого фильма и год его выхода, и то же самое для ‘gross’. Несмотря на это, мой код по-прежнему возвращает 0 как максимальное общее значение. Чего мне здесь не хватает?
def MaxGrossFinder(c):
for film in year:
MaxGross = 0
f = int(gross[film])
if year[film] == c:
if f > MaxGross:
MaxGross = f
return MaxGross
Комментарии:
1. Я думаю, это может быть потому, что год [фильм] никогда не равен c.
2. Это довольно неудобная структура.
3. Почему вы не используете
max()
?4.
gross
является ли глобальная переменная?5. Чем заполнен год и брутто
Ответ №1:
Используйте max()
функцию. Он выполняет эту операцию правильно.
max(int(gross[film]) for film in year if year[film] == c)
Ваша проблема в том, что вы устанавливаете MaxGross
нулевое значение на каждой итерации. Таким образом, все значения, кроме последнего, игнорируются.
Пожалуйста, также рассмотрите возможность создания класса Film и использования одного dict объектов film вместо нескольких параллельных dict.
Ответ №2:
Извлеките MaxGross
из for-loop
:
def MaxGrossFinder(c):
MaxGross = 0
for film in year:
f = int(gross[film])
if year[film] == c:
if f > MaxGross:
MaxGross = f
return MaxGross
MaxGross = 0
Внутри цикла for все предыдущие итерации ничего не значат. Повлияет только последнее MaxGross
. Вероятно, это не намерение.
Может возникнуть другая проблема, если c
и year[film]
являются плавающими. Не сравнивайте числа с плавающей точкой на равенство (если вы не знаете, что делаете), поскольку числа с плавающей точкой могут иметь неточные представления. Вместо этого определите некоторую концепцию близости:
def near(a,b,rtol=1e-5,atol=1e-8):
return abs(a-b)<(atol rtol*abs(b))
и сравните if near(year[film],c)
.
Ответ №3:
Вы можете использовать max() напрямую,
for film in year:
if year[film]==c:
print(max(int(gross[film]))