Добавить предыдущее слово Python - PullRequest
1 голос
/ 16 апреля 2020

Программа должна принять строку S с несколькими словами в качестве входных данных. Для каждого слова W, если его первый символ равен последнему символу предыдущего слова, то предыдущее слово должно быть добавлено в конце (добавление) к слово W. Иначе слово должно считаться напечатанным в следующей строке.

  def prev(a):
    b=[]
    for i in range(len(a)):

        t=a[i][0]
        if i-1>=0:
            if a[i-1][-1].lower()==t.lower():
                a[i]+=a[i-1]
                b.append(a[i-1])
    return a,b
 a=input().strip().split(" ")
 a,b=prev(a)
 for i in a:
     if i not in b:
         print(i)

Есть ли быстрый способ сделать это

Некоторые примеры ввода и вывода

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Вы можете использовать collections.deque для эффективной реализации искомого алгоритма. Это связано с тем, что операции добавления и выталкивания с любой стороны deque эффективны со сложностью O(1) в любом направлении.

Использование:

from collections import deque

def word_magic(string):
    tokens = deque(string.split())
    words = []
    while tokens:
        curr_word = tokens.popleft()
        if not tokens:
            words.append(curr_word)
            break

        next_word = tokens[0]
        if curr_word[-1] == next_word[0]:
            tokens.popleft()
            tokens.appendleft(next_word + curr_word)
            continue

        words.append(curr_word)

    return words

Вызов функции:

# Example 1
words = word_magic("are all levels lavendar lemon maverick king of gamblers")
print("\n".join(words))

# Example 2
words = word_magic("crab boy yesterday yellow wing game engine eat top")
print("\n".join(words))

Печать:

are
lemonlavendarlevelsall
kingmaverick
of
gamblers

boycrab
yellowyesterday
gamewing
eatengine
top
1 голос
/ 16 апреля 2020
s = "are all levels lavendar lemon maverick king of gamblers".split()

words = list(reversed(s))  # Reverse the list because we're poping from the end
while words:
    first = words.pop()
    rest = []
    while words and words[-1][0] == first[-1]:
        rest.append(words.pop())
    print("".join([*rest, first]))

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

Вы можете написать тот же код, используя индекс вместо list.pop:

words = "are all levels lavendar lemon maverick king of gamblers".split()

i = 0
while i < len(words):
    first = words[i]
    i += 1

    rest = []
    while i < len(words) and words[i][0] == first[-1]:
        rest.append(words[i])
        i += 1

    print("".join([*rest, first]))
0 голосов
/ 16 апреля 2020

Не тестировал его, но я бы попробовал 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...