присоединиться к списку предложений в фразы - PullRequest
0 голосов
/ 02 мая 2018

У меня есть список песен, которые выглядят так:

[' Extending a life\n', 'With total resistance\n', 
'To fatal disease\n', 'Future methods of science.\n', 
'Replacing what is real\n', 'By using technology\n', 
'Population control\n', 'Selecting those who will breed.\n',
'A specific type of form\n', 'Chosen for the unborn.\n', 
'A mind without emotion\n', 'Progressive anatomy.\n']

т.е. каждая лирика заканчивается символом новой строки, а некоторые заканчиваются точкой и символом новой строки.

Я хотел бы создать список, который выглядит следующим образом:

[' Extending a life\n With total resistance\n To fatal disease\n Future methods of science.\n', 
'Replacing what is real\n By using technology\n Population control\n Selecting those who will breed.\n',
'A specific type of form\n Chosen for the unborn.\n', 
'A mind without emotion\n Progressive anatomy.\n'] 

т.е. Каждое значение нового списка представляет собой полную лирическую строку с точкой в ​​конце каждой полной лирики.

У меня есть идея, как это сделать только для одного раздела текста:

def random_lyrics(song):
    i = 1
    formatted_song = []
    formatted_song.append(song[0][1:])
    while i <= len(song)-1:
        if song[i][len(song[i])-2] == '.':
            formatted_song[0] += song[i]
            break
        else:
            formatted_song[0] += song[i]
            i +=1 

Этот код работает для отдельных разделов текстов песен, которые необходимо объединить в формате, описанном выше.

Мне сложно обобщить эту функцию для работы со всем оригинальным списком текстов песен. Любой совет будет оценен.

** Обратите внимание, что слова, переданные в функцию, упорядочены правильно, т.е. упорядочены в соответствии с песней.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вы можете использовать itertools.groupby с re:

import re
import itertools
d = [' Extending a life\n', 'With total resistance\n', 'To fatal disease\n', 'Future methods of science.\n', 'Replacing what is real\n', 'By using technology\n', 'Population control\n', 'Selecting those who will breed.\n', 'A specific type of form\n', 'Chosen for the unborn.\n', 'A mind without emotion\n', 'Progressive anatomy.\n']
results = [list(b) for _, b in itertools.groupby(d, key=lambda x:bool(re.findall('\.\n', x)))]
final_result = [' '.join(results[i]+results[i+1]) for i in range(0, len(results), 2)]

Выход:

[' Extending a life\n With total resistance\n To fatal disease\n Future methods of science.\n', 'Replacing what is real\n By using technology\n Population control\n Selecting those who will breed.\n', 'A specific type of form\n Chosen for the unborn.\n', 'A mind without emotion\n Progressive anatomy.\n']
0 голосов
/ 02 мая 2018

Это один из способов с использованием цикла for.

lst = [' Extending a life\n', 'With total resistance\n', 
       'To fatal disease\n', 'Future methods of science.\n', 
       'Replacing what is real\n', 'By using technology\n', 
       'Population control\n', 'Selecting those who will breed.\n',
       'A specific type of form\n', 'Chosen for the unborn.\n', 
       'A mind without emotion\n', 'Progressive anatomy.\n']

def formatter(x):
    res = []
    part = []
    for i in x:
        part.append(i)
        if i[-2] == '.':
            res.append(part[:])
            part.clear()
    return [''.join(j) for j in res]

res = formatter(lst)

[' Extending a life\nWith total resistance\nTo fatal disease\nFuture methods of science.\n',
 'Replacing what is real\nBy using technology\nPopulation control\nSelecting those who will breed.\n',
 'A specific type of form\nChosen for the unborn.\n',
 'A mind without emotion\nProgressive anatomy.\n']
0 голосов
/ 02 мая 2018

Если я вас правильно понимаю, это можно сделать всего за

[s + '.\n' for s in ' '.join(lyrics).split('.\n')[:-1]]
...