#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. Добавлю объяснение позже.