import re
re_cat = re.compile("\[category\] (.*):")
categories = {}
category = None
for line in open("movies.txt", "r").read().split("\n"):
line = line.strip()
if not line:
continue
if re_cat.match(line):
category = re_cat.sub("\\1", line)
if not category in categories:
categories[category] = []
continue
categories[category].append(line)
print categories
делает следующий словарь:
{
'Action': ['Movie', 'Movie'],
'Horror': ['Movie', 'Movie', 'Movie'],
'Comedy': ['Movie']
}
Мы используем такое же регулярное выражение для сопоставления и удаления названия категории, поэтому эффективно скомпилировать его с помощью re.compile
.
У нас есть переменная, действующая category
, которая изменяется всякий раз, когда анализируется новая категория. Любая строка, которая не определяет новую категорию, добавляется в словарь categories
под соответствующим ключом. Категории, определенные в первый раз, создают список под правильным словарным ключом, но категории также могут быть перечислены несколько раз, и все закончится под правой клавишей.
Любые фильмы, перечисленные перед категорией, будут указаны в словаре под ключом None
.
Можете ли вы повторно разметить пример текстового файла как моноширинный «код»? Пронумерованные списки затрудняют просмотр точной последовательности символов. –
@Renzor - Пожалуйста, представьте пример короткого кода, как эта функция должна быть вызвана и что вы ожидаете получить в ответ, например. 'myFavorite (Horror) возвращает [Movie, Movie, Movie]' – Theodor