Найти - Пользователи
Полная версия: Возвращение значения из метода класса
Начало » Центр помощи » Возвращение значения из метода класса
1 2 3
vladimir_vl_vlad
Класс ищет в файле повторяющиеся подряд строки и должен возвращать результат в виде словаря {'строка': количество повторений}. Но у меня он возвращает словарь для каждой строки где цифры идут нарастающим итогом. Нужно чтобы не возвращались эти лишние словари. Прошу прощения если путано объяснил.
Содержимое файла 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)
FishHook
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)
AD0DE412
 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
FishHook
AD0DE412
В том виде, в котором автор дал условие задачи, нет ни слова про итераторы. Написано - цитирую - «должен возвращать результат в виде словаря». Результат, это один словарь, а не итератор словарей, список словарей или ещё какие-то галлюцинации
AD0DE412
ну да … просто мне так показалось из контекста
зы АВТОР ежеле появишся сздесь с тебя пояснить
AD0DE412
вот зачем етот несчасный некст в коде мучают
vladimir_vl_vlad
AD0DE412
ну да … просто мне так показалось из контекстазы АВТОР ежеле появишся сздесь с тебя пояснить
Ну, в общем, для каждой группы одинаковых строк должен возвращаться один словарь типа {'строка': количество повторений} Или не словарь, а просто два значения: строка, количество повторений. Итератор нужен т.к. файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память. Спасибо за ответы, буду разбираться.
FishHook
vladimir_vl_vlad
Итератор нужен т.к. файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память

ну как по файлу пройти, это другой вопрос, занафига класс то итератором делать? У вас задача - вернуть словарь, зачем здесь итератор? Сделайте без класса, простую функцию, которая принимает имя файла, а возвращает словарь
AD0DE412
vladimir_vl_vlad
файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память.
ну это точно не про мое решение )) тк у меня накапливаются эээ строки в self._account
xam1816
  
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB