Как пройти по списку и объединить некоторые фразы условно?

#python #string #list

#python #строка #Список

Вопрос:

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

Например:

 phrases = [
   'Title',
   'page',
   'Specification',
   'High speed drilling ma-',
   'chine is aimed at'
]
  

Вывод должен быть:

 merged_phrases = [
   'Title',
   'page',
   'Specification',
   'High speed drilling machine is aimed at'
]
  

Я начал писать код, но быстро застрял:

 merged_phrases = []
for phrase in phrases:
    if phrase[len(phrase)-1] == "-":
        # how can I merge "phrase" with the next one in "phrases"?
    else:
        merged_phrases.append(phrase)
  

Как объединить текущую phrase со следующей и удалить следующую из phrases ?

Комментарии:

1. На чем вы застряли? Каким вы хотите, чтобы конечный результат был? Вам действительно нужно использовать рекурсию? Если это так, вам нужно определить функцию, чего вы здесь не сделали.

2. @Code-Apprentice: я не уверен, должна ли это быть рекурсия или нет. Я хотел бы услышать некоторые рекомендации. Ожидаемый результат показан в сообщении.

Ответ №1:

Кажется, вам не нужна рекурсия. Небольшой взлом почти сделает работу:

 ','.join(phrases).replace('-,','').split(',')
  

Это приведет к сбою, если -, в нем содержится какая-либо фраза. Если вы можете, вы можете использовать любой другой символ или строку, вместо , которых не будет ни в каких фразах

Комментарии:

1. Что, если у меня есть запятая во фразе?

2. Да, если у вас есть «-,» в любой фразе, это приведет к сбою, вы можете исправить это, используя любой другой символ или случайную строку вместо «,», которые, вы уверены, не будут присутствовать ни в одной фразе.

Ответ №2:

Вы можете просто использовать традиционный for цикл, подобный этому:

 phrases = [
   'Title',
   'page',
   'Specification',
   'High speed drilling ma-',
    'chine is aimed at'

]
index_lst = []
merged_phrases = []
for index,phrase in enumerate(phrases):
    if index not in index_lst:
        if phrase[-1] == '-':
            merged_phrases.append(phrase[:-1] phrases[index 1])
            index_lst.append(index 1)
        else:
            merged_phrases.append(phrase)

print(merged_phrases)
  

Вывод:

 ['Title', 'page', 'Specification', 'High speed drilling machine is aimed at']
  

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

Если последовательные слова в вашем списке имеют - конец, то вы можете использовать этот код:

 phrases = [
   'Title',
   'page',
   'Specification',
   'High speed drilling ma-',
   'chine is aimed at-',
   ' test-',
   ' 123'
]
index_lst = []
merged_phrases = []
for index,phrase in enumerate(phrases):
    curr_phrase = ''
    if index not in index_lst:
        for i,x in enumerate(phrases[index:]):
            if x[-1] == '-':
                curr_phrase  = x[:-1]
                index_lst.append(index i)
            else:
                if curr_phrase != '':
                    merged_phrases.append(curr_phrase x)
                    index_lst.append(index   i)
                else:
                    merged_phrases.append(phrase)
                break

print(merged_phrases)
  

Вывод:

 ['Title', 'page', 'Specification', 'High speed drilling machine is aimed at test 123']
  

Комментарии:

1. Что делать, если две последовательные фразы имеют — в конце

2. @RahulK Посмотрите мою последнюю правку. И, пожалуйста, будьте достаточно любезны, чтобы удалить этот понижающий голос и убедиться, что вы нажали кнопку upvote. Спасибо за ваше предложение!

3. Добро пожаловать, теперь все хорошо. И downvote был не от меня. 🙂

Ответ №3:

Я бы сделал что-то вроде этого:

 merged_phrases = []
previous_phrase_merged = False
for i, phrase in enumerate(phrases):
  if previous_phrase_merged:
    previous_phrase_merged = False
    continue
  if phrase[-1] == '-':
    merged_phrase = phrase[:-1]   phrases[i   1]
    merged_phrases.append(merged_phrase)
    previous_phrase_merged = True
  else:
    merged_phrases.append(phrase)
  

Перечисление позволяет вам получить доступ к индексу фразы, чтобы вы могли легко ссылаться на следующую за ней в списке, и previous_phrase_merged действует как флаг, чтобы вы знали, когда пропустить элемент, если он только что был объединен с предыдущей фразой. Я не думаю, что вам нужна рекурсия для этой проблемы, надеюсь, это поможет!

Ответ №4:

 result = []
parts = []
for phrase in phrases:
    parts.append(phrase)
    if not phrase.endswith('-'):
        result.append(' '.join(parts))
        parts = []
if parts:
    result.append(' '.join(parts))
  

Дайте мне знать, если вам нужно объяснение по этому поводу.

Комментарии:

1. Вы все равно должны добавить объяснение. Дело в том, что эти ответы предназначены не только для OP, но и для будущих ссылок / людей с тем же вопросом.

2. Да, слишком усталый atm. Добавлю объяснение позже.