Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 24, 2022 06:51:13

vladimir_vl_vlad
Зарегистрирован: 2021-07-16
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

Класс ищет в файле повторяющиеся подряд строки и должен возвращать результат в виде словаря {'строка': количество повторений}. Но у меня он возвращает словарь для каждой строки где цифры идут нарастающим итогом. Нужно чтобы не возвращались эти лишние словари. Прошу прощения если путано объяснил.
Содержимое файла my_text.txt типа:
AAAAA
BBBBB
CCCCC
CCCCC
CCCCC
DDDDD
EEEEE
EEEEE

 class LinesCompare:
    def __init__(self, file_name):
        self.file_name = file_name
        self.file = None
        self.prev_line = ''
        self.same_lines = {}
    def __iter__(self):
        self.file = open(self.file_name, 'r')
        return self
    def __next__(self):
        try:
            line = next(self.file)
            line = line[:-1]
            if line == self.prev_line:
                self.same_lines[line] += 1
            else:
                self.same_lines = {line: 1}
            self.prev_line = line
        except StopIteration:
            self.file.close()
            self.file = None
            raise
        return self.same_lines
line_compare = LinesCompare(file_name='my_text.txt')
for value in line_compare:
    print(value)

Офлайн

#2 Июнь 24, 2022 10:17:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

vladimir_vl_vlad
проще всего в таких случаях использовать метод словаря set_default

   
d = {}
for i in "abcaddfakdfdalaas;kj;asd":
    d.setdefault(i, 0)
    d[i] += 1
print(d)


или использовать defaultdict
 from collections import defaultdict
d = defaultdict(lambda: 0)
for i in "abcaddfakdfdalaas;kj;asd":
    d[i] += 1
print(d)



Офлайн

#3 Июнь 24, 2022 10:31:33

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

 class LinesCompare:
    def __init__(self, file_name):
        self.file_name = file_name
        self._account = {}
        with open(self.file_name, 'r') as f:
            for i in f:
                if i in self._account:
                    self._account[i] += 1
                else:
                    self._account.update({i: 1})
        self._keys = list(self._account.keys())
        self._max = len(self._keys)
    def __iter__(self):
        self._num = 0
        return self
    def __next__(self):
        if self._num < self._max:
            result = {self._keys[self._num][:-1]: self._account[self._keys[self._num]]}
            self._num += 1
            return result
        else:
            raise StopIteration
 {'AAAAA': 1}
{'BBBBB': 1}
{'CCCCC': 3}
{'DDDDD': 1}
{'EEEEE': 2}
так тут задача как я понимаю на коленке сделать типа своего __next__ a



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Июнь 24, 2022 10:39:39)

Офлайн

#4 Июнь 24, 2022 11:10:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

AD0DE412
В том виде, в котором автор дал условие задачи, нет ни слова про итераторы. Написано - цитирую - «должен возвращать результат в виде словаря». Результат, это один словарь, а не итератор словарей, список словарей или ещё какие-то галлюцинации



Офлайн

#5 Июнь 24, 2022 11:23:48

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

ну да … просто мне так показалось из контекста
зы АВТОР ежеле появишся сздесь с тебя пояснить



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#6 Июнь 24, 2022 11:26:52

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

вот зачем етот несчасный некст в коде мучают



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#7 Июнь 24, 2022 12:25:19

vladimir_vl_vlad
Зарегистрирован: 2021-07-16
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

AD0DE412
ну да … просто мне так показалось из контекстазы АВТОР ежеле появишся сздесь с тебя пояснить
Ну, в общем, для каждой группы одинаковых строк должен возвращаться один словарь типа {'строка': количество повторений} Или не словарь, а просто два значения: строка, количество повторений. Итератор нужен т.к. файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память. Спасибо за ответы, буду разбираться.

Офлайн

#8 Июнь 24, 2022 13:43:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

vladimir_vl_vlad
Итератор нужен т.к. файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память

ну как по файлу пройти, это другой вопрос, занафига класс то итератором делать? У вас задача - вернуть словарь, зачем здесь итератор? Сделайте без класса, простую функцию, которая принимает имя файла, а возвращает словарь



Офлайн

#9 Июнь 24, 2022 18:20:45

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

vladimir_vl_vlad
файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память.
ну это точно не про мое решение )) тк у меня накапливаются эээ строки в self._account



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Июнь 24, 2022 23:32:21)

Офлайн

#10 Июнь 24, 2022 23:58:03

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

Возвращение значения из метода класса

  
class LinesCompare:
    def __init__(self, file_path):
        self.file_path = file_path
 
    def count_same_lines(self):
        out = {}
        with open(self.file_path, 'r') as f:
            for line in f.read().splitlines():
                out.setdefault(line, 0)
                out[line] += 1
        return out
 
if __name__ == '__main__':
    lc = LinesCompare('my_file.txt')
    res = lc.count_same_lines()
    print(res)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version