Форум сайта python.su
Класс ищет в файле повторяющиеся подряд строки и должен возвращать результат в виде словаря {'строка': количество повторений}. Но у меня он возвращает словарь для каждой строки где цифры идут нарастающим итогом. Нужно чтобы не возвращались эти лишние словари. Прошу прощения если путано объяснил.
Содержимое файла 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)
Офлайн
vladimir_vl_vlad
проще всего в таких случаях использовать метод словаря set_default
d = {} for i in "abcaddfakdfdalaas;kj;asd": d.setdefault(i, 0) d[i] += 1 print(d)
from collections import defaultdict d = defaultdict(lambda: 0) for i in "abcaddfakdfdalaas;kj;asd": d[i] += 1 print(d)
Офлайн
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}
Отредактировано AD0DE412 (Июнь 24, 2022 10:39:39)
Офлайн
AD0DE412
В том виде, в котором автор дал условие задачи, нет ни слова про итераторы. Написано - цитирую - «должен возвращать результат в виде словаря». Результат, это один словарь, а не итератор словарей, список словарей или ещё какие-то галлюцинации
Офлайн
ну да … просто мне так показалось из контекста
зы АВТОР ежеле появишся сздесь с тебя пояснить
Офлайн
вот зачем етот несчасный некст в коде мучают
Офлайн
AD0DE412Ну, в общем, для каждой группы одинаковых строк должен возвращаться один словарь типа {'строка': количество повторений} Или не словарь, а просто два значения: строка, количество повторений. Итератор нужен т.к. файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память. Спасибо за ответы, буду разбираться.
ну да … просто мне так показалось из контекстазы АВТОР ежеле появишся сздесь с тебя пояснить
Офлайн
vladimir_vl_vlad
Итератор нужен т.к. файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память
Офлайн
vladimir_vl_vladну это точно не про мое решение )) тк у меня накапливаются эээ строки в self._account
файл может быть очень большим и должен читаться постепенно без загрузки всего файла в оперативную память.
Отредактировано AD0DE412 (Июнь 24, 2022 23:32:21)
Офлайн
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)
Офлайн