Не тестировал его, но я бы попробовал fold . Модуль functools предоставляет функцию сокращения :
>>> s = "are all levels lavendar lemon maverick king of gamblers"
Разбить строку на пробелы:
>>> t = s.split(" ")
>>> t
['are', 'all', 'levels', 'lavendar', 'lemon', 'maverick', 'king', 'of', 'gamblers']
И свернуть список:
>>> import functools
>>> u = functools.reduce(lambda acc, x: acc[:-1] + [x+acc[-1]] if acc and x and acc[-1][-1] == x[0] else acc + [x], t, [])
>>> u
['are', 'lemonlavendarlevelsall', 'kingmaverick', 'of', 'gamblers']
Начнем с пустого списка []
. Существует два случая: если последняя буква предыдущего слова (или упакованного слова) является первой буквой текущего слова (acc[-1][-1] == x[0]
), то мы вставляем текущее слово перед предыдущим словом (или упакованным словом): acc[:-1] + [x+acc[-1]]
. В противном случае мы добавляем текущее слово в список.
Теперь просто выведите результат:
>>> print("\\n".join(u))
are
lemonlavendarlevelsall
kingmaverick
of
gamblers
Другая версия, основанная на наблюдении, что если у нас есть слово w[i]
с последней буквой c=w[i][-1]
, так что w[i+1][0] = c
, затем мы строим w[i+1]+w[i]
, и последняя буква снова будет c
: нам просто нужно проверить, начинаются ли следующие слова w[i+2], w[i+3], ...
с c
et c. Если нет, начните новую строку.
s = "are all levels lavendar lemon maverick king of gamblers"
t = s.split(" ")
i = 0
while i < len(t):
c = t[i][-1]
j = i+1
cur = [t[i]]
while j<len(t) and t[j][0] == c:
cur.insert(0, t[j])
j += 1
print("".join(cur))
i = j