Использование перечисления в генераторе для разбора текста - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь перебрать текстовый файл (содержащий несколько историй) и вернуть список списков, где каждый список - это новая история.

  • read_lines_in_text (fname) - этогенератор, который я хочу перебрать, чтобы прочитать каждую строку в текстовом файле.Это должно оставаться генератором.

  • find_title (fname) - это функция, которая должна использоваться и возвращает список строк в тексте, где появляется заголовок (и, следовательно, сигнализирует началоновая история).

Код, который я написал ниже, выполняет свою работу, но я думаю, что это не очень хорошее решение.

newdict = {}
story = []
list_of_stories = []

for idx, line in enumerate(read_lines_in_text(fname)):
    if line in find_title(fname):
        newdict[idx] = line

for idx, line in enumerate(read_lines_in_text(fname)):
    if idx >= list(newdict.keys())[0]:
        if idx in newdict:
            list_of_stories.append(story)
            story = []
            story.append(line)
        else:
            story.append(line)

Учитывая, что у меня есть индексы, где каждый заголовок встречается в тексте, я хочу иметь что-то вроде следующего:

for lines between key i and key i+1 in mydict:
append to story
list_of_stories.append(story)
story = []

1 Ответ

0 голосов
/ 27 октября 2018

Вам не нужно использовать индексы вообще. Просто создайте новый список story, если у вас есть новый заголовок , и добавьте предыдущий к list_of_stories:

story = []
list_of_stories = []
titles = set(find_title(fname))

for line in read_lines_in_text(fname):
    if line in titles:
        # start a new story, append the previous
        if story:
            list_of_stories.append(story)
        story = [line]
    elif story:  # a story has been started
        story.append(line)

# handle the last story
if story:
    list_of_stories.append(story)

При использовании функции генератора вы действительно хотите избегать обработки ее как последовательности произвольного доступа с порядковыми номерами.

Обратите внимание, что мы также избегаем читать fname более одного раза, чтобы получить заголовки; переменная titles представляет собой набор строк заголовков, возвращаемых find_title(), которые хранятся в виде набора для быстрого тестирования членства.

...