объединить элементы списка в новый список в зависимости от условия - PullRequest
0 голосов
/ 02 июня 2019

У меня есть список с предложениями.и другой список с несколькими словами.

sentences=['this is first', 'this is one', 'this is three','this is four','this is five','this is six']
exceptions=['one','four']

Я хочу зациклить предложения, и если предложение заканчивается одним из слов, содержащихся в [исключениях], объединить со следующим предложением.

результат:

sentences2=['this is first', 'this is one this is three','this is four this is five','this is six']

Я не смог прийти с какой-либо вероятной попыткой, которая была бы близка к работе.

Я начал с цикла, затем преобразовал список в итератор:

myter = iter(sentences)

затем попытайтесь объединить предложения и добавить объединенные предложения в предложение 2.

все безрезультатно.

Последняя моя попытка была:

i=0
while True:
    try:
        if sentences[i].split(' ')[-1] in exceptions:
            newsentence = sentence[i] + sentence[i+1]
            sentences[i] = newsentence
            sentences.pop(i+1)
            i = i +1
        else:
            i=i+1
    except:
        break

 print('\n-----\n'.join(sentences))

Почему-то у меня такое впечатление, что я пытаюсь сделать это с неправильным подходом.

спасибо.

Ответы [ 3 ]

1 голос
/ 02 июня 2019

Вы можете сжать sentences с одним смещением, используя zip_longest из itertools.Это позволит вам выполнить проверку, выполнить конкатенацию при необходимости и пропустить следующую итерацию, если это не так.

from itertools import zip_longest

sentences2 = []
skip = False
for s1, s2 in zip_longest(sentences, sentences[1:]):
    if skip:
        skip = False
        continue
    if s1.split()[-1].lower() in exceptions:
        sentences2.append(f'{s1} {s2}')
        skip = True
    else:
        sentences2.append(s1)

sentences2
# returns:
['this is first', 'this is one this is three', 'this is four this is five', 'this is six']

Редактировать:

Вам необходимо обработать случай объединения нескольких предложений встрока.В этой ситуации вы можете использовать флаг, чтобы отслеживать, следует ли вам присоединиться к следующему предложению или нет.Это немного сложнее, но здесь это так:

sentences2 = []
join_next = False
candidate = None
for s in sentences:
    if join_next:
        candidate += (' ' + s)
        join_next = False
    if candidate is None:
        candidate = s
    if s.split()[-1].lower() in exceptions:
        join_next = True
        continue
    else:
        sentences2.append(candidate)
        candidate = None

sentences2
# returns:
['this is first',
 'this is one this is three',
 'this is four this is five',
 'this is six']

Вот пример, который добавляет дополнительное предложение, которое требует объединения в цепочку.

sentences3 = ['this is first', 'this is one', 'extra here four', 
              'this is three', 'this is four', 'this is five', 'this is six']

sentences4 = []
join_next = False
candidate = None
for s in sentences3:
    if join_next:
        candidate += (' ' + s)
        join_next = False
    if candidate is None:
        candidate = s
    if s.split()[-1].lower() in exceptions:
        join_next = True
        continue
    else:
        sentences4.append(candidate)
        candidate = None

sentences4
# returns:
['this is first',
 'this is one extra here four this is three',
 'this is four this is five',
 'this is six']
0 голосов
/ 03 июня 2019

Ваше решение работает, за исключением одного случая: когда два предложения в строке заканчиваются словом исключения.Решение состоит в том, чтобы не увеличивать i после объединения двух предложений, чтобы он проверял последнее слово объединенного предложения на следующей итерации.

Вам также необходимо поставить пробел междупредложения при их объединении.

И вместо того, чтобы использовать исключение для определения, когда вы достигнете конца, просто правильно ограничьте i.

sentences=['this is first', 'this is one', 'this is three','this is one', 'this is four','this is five','this is six']
exceptions=['one','four']
i=0
while i < len(sentences) - 1:
    if sentences[i].split(' ')[-1] in exceptions:
        newsentence = sentences[i] + " " + sentences[i+1]
        sentences[i] = newsentence
        sentences.pop(i+1)
    else:
        i=i+1

print('\n-----\n'.join(sentences))
0 голосов
/ 03 июня 2019

Вы можете добавить символ конца строки к предложениям, не заканчивающимся словами исключения (и пробел для других), присоединяясь к ним.(а затем разделить на конец строки, если вам нужно):

 sentences=['this is first', 'this is one', 'this is three','this is four','this is five','this is six']
 exceptions=['one','four']

 result = "".join(s + "\n "[any(s.endswith(x) for x in exceptions)] for s in sentences).strip().split("\n")
 print(result)

 # ['this is first', 'this is one this is three', 'this is four this is five', 'this is six']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...