Начало вложенного цикла от текущей позиции элемента до конца списка
У меня есть текстовый файл со следующей структурой:
name1:
sentence. [sentence. ...] # can be one or more
name2:
sentence. [sentence. ...]
РЕДАКТИРОВАТЬ входной образец:
Djohn:
Hello. I am Djohn
I am Djohn.
Bot:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
est laborum.
Ninja:
Hey guys!! wozzup
РЕДАКТИРОВАТЬ 2 Входной образец:
This is example sentence that can come before first speaker.
Djohn:
Hello. I am Djohn
I am Djohn.
Bot:
Yes, I understand, don't say it twice lol
Ninja:
Hey guys!! wozzup
Каждый элемент (имя или предложение) является строкой Unicode. Я помещаю эти данные в список и хочу сформировать словарь:
{
'name1': [[sentence.], ..]
'name2': [[sentence.], ..]
}
РЕДАКТИРОВАТЬ 3
Словарь, который я создаю, предназначен для записи в файл и представляет собой набор строк Unicode.
То, что я пытаюсь сделать, это:
for i, paragraph in enumerate(paragraphs): # paragraphs is the list
# with Unicode strings
if isParagraphEndsWithColon(paragraph):
name = paragraph
text = []
for p in range(paragraphs[i], paragraphs[-1]):
if isParagraphEndsWithColon(p):
break
localtext.extend(p)
# this is output dictionary I am trying to build
outputDocumentData[name].extend(text)
Например, мне нужно сделать вложенный цикл из найденного предложения name: до следующего, расширяя список предложений для того же ключа (который является name). Дело в том, что range() здесь не работает, потому что он ожидает целые числа.
Ищите "питонный" способ сделать вложенный цикл от текущего элемента до конца списка. (создается впечатление, что создание фрагмента списка на каждой итерации будет неэффективным)
1 ответ
Вы можете использовать groupby:
from itertools import groupby
lines = ["Djohn:",
"Hello. I am Djohn",
"I am Djohn.",
"Bot:",
"Yes, I understand, don't say it twice lol",
"Ninja:",
"Hey guys!! wozzup"]
name = ''
result = {}
for k, v in groupby(lines, key= lambda x: x.endswith(':')):
if k:
name = ''.join(v).lstrip(':')
else:
result.setdefault(name, []).extend(list(v))
print(result)
Выход
{'Djohn:': ['Hello. I am Djohn', 'I am Djohn.'], 'Ninja:': ['Hey guys!! wozzup'], 'Bot:': ["Yes, I understand, don't say it twice lol"]}
Идея состоит в том, чтобы сгруппировать входные данные в строку имени, а не в строку имени, поэтому вы используете key lambda x: x.endswith(':')
,