Задать вопрос
weranda
@weranda

Как построить цикл при множественном переборе элементов?

Приветствую

Задача
На основе первого слова нужно перестроить предложение таким образом, чтобы первая буква каждого следующего слова совпадала с предыдущей буквой предыдущего слова, а все остальные слова, которые не подходят под это правило должны идти за отсортированным по заданному выше алгоритму.

Дана строка:
a = 'pol xxx nog yyy len'

Имея в качестве первого слова pol, предложение по идее должно превратиться в: 'pol len nog xxx yyy'.

До конца не могу понять как это реализовать. Первые этапы вроде понятны:
1. преобразуем строку в список
2. запускаем цикл for ... in с поиском совпадений по условиям
3. найденные совпадения добавляем в новую строку

Вот в этом месте начинаются сложности. Ну прошлись мы циклом по списку, ну добавили подходящие по условию элементы в строку, но при одном проходе цикла строка принимает незаконченный вид: 'pol len'.

4. Можно удалить найденные совпадения из списка и добавить их к новой строке, тогда строка примет следующий вид: 'pol len xxx nog yyy'. Но последовательность слов в этой сроке не является логически завершенной, строка должна иметь такой вид: 'pol len nog xxx yyy'.

5. Чтобы строка приобрела законченный вид в данном примере, можно добавить второй цикл или применить цикл со счетчиком типа while и задать счетчику какое-то значение.

На этом этапе тоже сложности с пониманием. Если предложение заранее не известно, то нельзя же задать количество итераций на глаз. Можно установить количество итераций равное количеству элементов списка, но подозреваю, что это неразумно и при большом количестве предложений весь процесс может затянуться.

Поведайте правильный или правильные пути решения этой задачи.
  • Вопрос задан
  • 206 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя Антон Федорян К ответам на вопрос (5)
AnnTHony
@AnnTHony
Интроверт
Недолго думая решение в лоб (неоптимизированное):

a = 'len asd sas nas sda orr' # исходная строка
x = a.split(' ') # формируем из нее массив
r.append(x[0]) # берем первый элемент с которого начнем
del x[0] # удаляем чтобы не мешал
while (len(x) > 0): # пока исходный массив не пустой
	z = False # проверка на то, что слово начинается с последней буквы предыдущего слова
	for i in x:
		if (i[0] == r[-1][-1]): # если начинается, то добавляем в массив
			r.append(i)
			del x[x.index(i)]
			z = True
			break
	if (not z): # если слово не найдено, то дописываем оставшиеся
		r.extend(x)
		x = []

r
>>> ['len', 'nas', 'sas', 'sda', 'asd', 'orr']
Ответ написан
Комментировать