Создание метода в Python

У меня есть файл. Я разделяю это в классе. Кроме того, я хочу вернуть первые n лет с наибольшим количеством снятых фильмов. И я буду использовать атрибуты строк для получения данных.

import re

import collections

 

class movie_analyzer:

    def __init__(self,s):

            self.lines=open(s, encoding = "latin-1").read().split('\n')

            self.lines=[x.split('::') for x in self.lines]
       

    def freq_by_year(self):

        movies_years = [x[3] for x in self.lines]

        c = collections.Counter(movies_years)      

        for movies_years, freq in c.most_common(3):

            print(movies_years, ':', freq)



movie=movie_analyzer("modified.dat")

movie.freq_by_year()

Это дает эту ошибку:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-627-51913258f9e4> in <module>
----> 1 movie.freq_by_year()
 
<ipython-input-624-8dc663c0b252> in freq_by_year(self)
      9     def freq_by_year(self):
     10 
---> 11         movies_years = [x[3] for x in self.lines]
     12 
     13         c = collections.Counter(movies_years)
 
<ipython-input-624-8dc663c0b252> in <listcomp>(.0)
      9     def freq_by_year(self):
     10 
---> 11         movies_years = [x[3] for x in self.lines]
     12 
     13         c = collections.Counter(movies_years)
 
IndexError: list index out of range    

Кроме того, movie.lines выглядит так:

[['1', 'Toy Story', "Animation|Children's|Comedy", '1995'],
 ['2', 'Jumanji', "Adventure|Children's|Fantasy", '1995'],
 ['3', 'Grumpier Old Men', 'Comedy|Romance', '1995'],
 ['4', 'Waiting to Exhale', 'Comedy|Drama', '1995'],
 ['5', 'Father of the Bride Part II', 'Comedy', '1995'],
 ['6', 'Heat', 'Action|Crime|Thriller', '1995'],
 ['7', 'Sabrina', 'Comedy|Romance', '1995'],
 ['8', 'Tom and Huck', "Adventure|Children's", '1995'],
 ['9', 'Sudden Death', 'Action', '1995'],
 ['10', 'GoldenEye', 'Action|Adventure|Thriller', '1995']]

.dat файл выглядит так:

Movies = ["1::История игрушек::Анимация|Детская|Комедия::1995\n",

"2::Джуманджи::Приключения|Детская|Фэнтези::1995\n",

'3::Сварливые старики::Комедия|Романтика::1995\n',

'4::В ожидании выдоха::Комедия|Драма::1995\n',

'5::Отец невесты, часть 2::Комедия::1995\n']

Пожалуйста, включите код/ошибки/текстовые данные в виде текста, а не изображений. См. meta.stackoverflow.com/questions/285551/…

Thierry Lathuille 12.12.2020 18:58

И проверьте свои данные, возможно, у вас есть строка с меньшим количеством полей, чем вы ожидаете.

Thierry Lathuille 12.12.2020 18:59

Можете ли вы предоставить содержимое файла «modified.dat»?

Turtlean 12.12.2020 19:05

Я отредактировал часть ошибки.

user14800447 12.12.2020 19:06

Кроме того, я предоставил содержимое файла данных.

user14800447 12.12.2020 19:10

Я запустил ваш код с файлом, который я реконструировал из Movies, и у меня это сработало. Возможно, вы ссылаетесь на неправильный файл.

quamrana 12.12.2020 19:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил две потенциальные проблемы в функции __init__, учитывая ваш код и файл .dat:

def __init__(self, s):

  self.lines = open(s, encoding = "latin-1").read().split('\n')

  self.lines = [x.split('::') for x in self.lines]
  self.lines = [l for l in self.lines if len(l) == 4] # <--(1)
  for line in self.lines: # <--(2)
      line[3] = re.sub('\D', '', line[3])

(1) Анализируется дополнительная строка, содержащая только пустой символ: "". Таким образом, из соображений безопасности вы можете удалить любую строку, в которой нет точно тех четырех элементов, которые вы ожидаете.

(2) Некоторые years анализируются неправильно из-за прикрепленных к ним нецифровых символов, таких как "" или /n. Вы можете курировать столбец лет, используя регулярное выражение, которое фильтрует каждый символ, который не является цифрой.

Большое спасибо! Вы правы, это работает. В данных есть несколько лишних строк :/

user14800447 12.12.2020 20:11

Другие вопросы по теме