Поиск максимального значения в python

#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]))