Почему мой код, обращающий каждое слово, не меняет некоторые слова?

#python #stack

#python #стек

Вопрос:

Что я хочу сделать

Я пытаюсь создать программу, которая переворачивает каждое слово, но не переворачивает слова в тегах.
Пример ввода и вывода:

Ввод:

 Thank you stack overflow
 

Вывод:

 knahT uoy kcats wolfrevo
 

Если слово находится в тегах, оно не должно быть перевернуто. Вот так:

Ввод:

 <tag>something
 

Вывод:

 <tag>gnihtemos
 

Мой код

Я попытался решить это с помощью алгоритма стека.

 s = input()
def stackprint(st):
    while st != []:
        print(st.pop(), end="")
stack = []
tag = False
for ch in s:
    if ch == '<':
        stackprint(stack)
        tag = True
        print(ch, end="")
    elif ch == '>':
        tag = False
        print(ch, end="")
    elif tag:
        print(ch, end="")
    else:
        if ch == ' ':
            stackprint(stack)
            print(ch, end="")
        else:
            stack.append(ch)
print("".join(stack))
 

Проблема

Но мой код не работает, если есть только одно слово или нет тега. Когда нет тега, последнее слово не реверсируется, а когда есть только одно слово, оно не реверсируется.

Вывод теперь:

Первый

При вводе:

 <tag>something
 

Вывод:

 <tag>something 
 

^ Мне нужно что-то поменять местами.

Второй

Ввод:

 Thank you stack overflow
 

Вывод:

 knahT uoy kcats overflow
 

^ Мне нужно, чтобы переполнение было отменено.

Важно

Мне нужно, чтобы все, что внутри < >, не было обращено вспять. Если слово находится в тегах, оно не должно быть реверсировано, как ввод:

 <tag>word<tag>
 

вывод:

 <tag>drow<tag>
 

Между тегом и словом не будет пробела.

 Thank you <tag>stack overflow
 
 knahT uoy <tag>kcats wolfrevo
 

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

1. Вместо того, чтобы присоединяться к стеку в конце, вызовите stackprint метод. Это гарантирует, что стек будет очищен до завершения работы скрипта.

2. Кажется, сейчас самое время научиться отлаживать. Разработайте на бумаге, как вы хотите, чтобы ваш код выполнялся и какие значения вы ожидаете, чтобы ваши переменные имели в какой момент кода. Как это соотносится со значениями, которые вы на самом деле получаете?

3. @NotThatGuy Что вы имеете в виду?

4. будет ли пробел между «<tag>» и следующим словом? каким будет результат для этого «Спасибо <тег> переполнение стека»?

5. Вы снова тестировали свой код после его редактирования? Если нет, вы должны это сделать, и обычно не рекомендуется вносить изменения в вопросы, которые потенциально могут решить проблему, с которой вы столкнулись, и, таким образом, сделать вопрос недействительным (а лучше оставить эту информацию для ответов или просто удалить вопрос, если вы считаете, что это вряд ли будет полезно другим). Кроме того, вы, вероятно, имели в виду stackprint(stack) и нет stackprint(st) .

Ответ №1:

Как я упоминал в разделе комментариев, вместо печати стека с помощью метода join вызов метода stackprint для обеспечения очистки стека даст вам желаемый результат.

 s = input()
def stackprint(st):
    while st != []:
        print(st.pop(), end="")
stack = []
tag = False
for ch in s:
    if ch == '<':
        stackprint(stack)
        tag = True
        print(ch, end="")
    elif ch == '>':
        tag = False
        print(ch, end="")
    elif tag:
        print(ch, end="")
    else:
        if ch == ' ':
            stackprint(stack)
            print(ch, end="")
        else:
            stack.append(ch)
stackprint(stack)
 

Ответ №2:

Похоже, это работает с примерами, которые вы предоставили:

 def revSetence(sentence):
    sentence = sentence   " ";
    flag = False
    final_sentence = ""
    word = ""
    for letter in sentence:
        if letter == "<":
            flag = True
        if letter == ">":
            flag = False
        if letter.isalpha():
            if flag:
                final_sentence = final_sentence   letter
            else:
                word = word   letter
        else:
            if len(word) > 0:
                final_sentence = final_sentence   word[::-1] 
            final_sentence = final_sentence   letter
            word =""
    return final_sentence