Добавить имена персонажей и их строки в новый словарь из массива / списка - PullRequest
0 голосов
/ 23 октября 2019

У меня есть сценарий фильма. Моя первая работа - собирать строки каждого символа в словаре.

Позже мне нужно будет поместить данные в серию.

Прямо сейчас у меня все диалоги в списке,начиная с имен персонажей. Он имеет следующий формат:

Диалог [0] 'NAME1 \ n (16 пробелов) YO, YO, хорошо, что вы здесь, человек.'

Все имена заканчиваются на \п. И тогда все строки диалога начинаются с 16 пробелов. Я думаю, что это может быть полезно, но я не уверен, как это использовать.

Я пробовал несколько вещей, но почти не повезло.

    result = {}
    for lines in dialogue:
        first_token = para.split()[0]
        if first_token.endswith('\n'): #this would be the name
            name, line = para.split(on the new line?)
            name = name.strip()
            if name not in result:
                result[name] = []
            result[name].append(line)
    return result

Этот код дает мнекуча ошибок, так что я не думаю, что было бы полезно перечислять их здесь.

В идеале мне нужно, чтобы каждый символ был первым ключом в словаре, а затем все их строки в качестве данных.

Примерно так:

Имя1: [Строка1, Строка2, Строка3 ...] Имя2: [Строка1, Строка2, Строка3 ...]

РЕДАКТИРОВАТЬ: Некоторые из имен символов имеют дваслова

РЕДАКТИРОВАТЬ 2: Возможно, было бы проще вернуться к исходному текстовому файлу сценария фильма.

Он отформатирован следующим образом:

          NAME1
Yo, Yo, good that you're here
man.

          NAME2
     (Laughing)
I don't think that's good!  We were
at the club, smoking, laughing -- doing
stuff.

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Метод 1:

Разделить на '\ n' и разделить. Первым элементом списка будет имя, а остальные будут ваши строки. str.pop изменит ваш список на месте. Это решение не будет работать, если в ваших диалогах есть многострочные строки.

>>> dialogue
'NAME1\n                abc adbaiuho saidainbw\n                sadi waiudi qoweoq asodhoqndoqndqwdq.\n                qiudwqd aisdiqnd asfiqwofnqofoweqomdomkmq!!'
>>> lines = list(map(str.strip, dialogue.split('\n')))
>>> lines
['NAME1', 'abc adbaiuho saidainbw', 'sadi waiudi qoweoq asodhoqndoqndqwdq.', 'qiudwqd aisdiqnd asfiqwofnqofoweqomdomkmq!!']
>>> name = lines.pop(0)
>>> name
'NAME1'
>>> lines
['abc adbaiuho saidainbw', 'sadi waiudi qoweoq asodhoqndoqndqwdq.', 'qiudwqd aisdiqnd asfiqwofnqofoweqomdomkmq!!']

Метод 2:

Если у вас есть многоканальные диалоги, то есть диалоги могут содержать '\ n'символ, первый разделенный первым появлением символа '\ n'. Первым элементом будет имя, а следующий элемент мы далее разделим на '16 пробелов'.

>>> dialogue
'NAME1\n                abc adbaiuho saidainbw\n                sadi waiudi qoweoq asodhoqndoqndqwdq.\n                qiudwqd aisdiqnd asfiqwofnqofoweqomdomkmq!!'
>>> parse_temp = dialogue.split('\n',1)
>>> name = parse_temp[0]
>>> lines = parse_temp[1].split(" " * 16)[1:]
>>> name
'NAME1'
>>> lines
['abc adbaiuho saidainbw\n', 'sadi waiudi qoweoq asodhoqndoqndqwdq.\n', 'qiudwqd aisdiqnd asfiqwofnqofoweqomdomkmq!!']

Как функция,

def parse(dialogue):
    parse_temp = dialogue.split('\n',1)
    name = parse_temp[0].strip()
    lines = list(map(str.strip, parse_temp[1].split(" " * 16)[1:]))
    return name, lines

Примечание: Здесь для второго разделения выможно заменить любым пробелом, который у вас есть. Вы даже можете разделить его с помощью регулярного выражения. Я использовал здесь 16 простых пробелов.

Код, добавленный по запросу для итерации:

data = dict()
for _dialogue in dialogue:
   name, lines = parse(_dialogue)
   data[name] = data.get(name, list()) + lines
0 голосов
/ 23 октября 2019
  • разделить текстовые строки
  • создать dict с уникальными ключами для каждого актера
  • добавить строки актеров в dict

EDIT: добавлены пробелы в регулярном выражении имени, полоса с пробелами

import re
lines = [
    "Dialogue[0] 'NAME1 \n                YO, YO, good that you're here man.'",
    "Dialogue[1] 'NAME 1\n                YO, YO, ",
    "Dialogue[2] 'NAME2\n                YO, YO, good that ",
    "Dialogue[3] 'NAME2\n                YO, YO, good that you're here'",
]

regex = h = re.compile("'([A-Z 0-9]+)\n[ ]{16}(.+)")
lineslist = [re.findall(regex, line) for line in lines]
lineslist = [ match[0] for match in lineslist if len(match)]
keys = [l[0].strip() for l in lineslist]
result = {k:[] for k in set(keys)}
[result[l[0].strip()].append(l[1]) for l in lineslist]
result

Вывод:

{'NAME 1': ['YO, YO, '],
 'NAME1': ["YO, YO, good that you're here man.'"],
 'NAME2': ['YO, YO, good that ', "YO, YO, good that you're here'"]}
0 голосов
/ 23 октября 2019

ИЗМЕНЕННЫЙ ОТВЕТ: Возвращаясь к вашему исходному файлу, если мы можем предположить, что все имена символов имеют 22 пробельных символа перед ними, мы можем сделать что-то вроде этого:

example = """
                      NAME1
            Yo, Yo, good that you're here
            man.

                      NAME2
                 (Laughing)
            I don't think that's good!  We were
            at the club, smoking, laughing -- doing
            stuff.
"""

lines = example.split('\n')
characters = [line for line in lines if line.startswith(' ' * 22)]
result = {c.strip(): [] for c in characters}
current = ''
for line in lines:
    if line in characters:
        current = line.strip()
    elif current:
        result[current].append(line.strip())

Результат теперь:

{'NAME1': ["Yo, Yo, good that you're here", 'man.', ''], 'NAME2': ['(Laughing)', "I don't think that's good!  We were", 'at the club, smoking, laughing -- doing', 'stuff.', '']}

Возможно, потребуется дополнительная очистка

...