#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