Как поменять порядок слов в питоне
Перейти к содержимому

Как поменять порядок слов в питоне

  • автор:

Изменить порядок слов в строке на обратный

Вводится строка, состоящая из слов, разделенных пробелами. Следует заменить ее на строку, в которой слова идут в обратном порядке по-сравнению с исходной строкой. Вывести измененную строку на экран.

Данная задача существенно проще решается, если изменяется не исходная строка, а формируется новая из слов первой, но слова из первой берутся начиная с конца. После того как новая строка будет сформирована, ее можно присвоить переменной, которой была присвоена исходная строка, таким образом перезаписав ее.

Если пишется отдельная функция для изменения порядка слов, то в нее можно передавать исходную строку, а она будет возвращать измененную. Возвращаемое значение может быть присвоено той же самой переменной, значение которой передавалось в функцию.

В общих чертах алгоритм может быть таким. Строка просматривается с конца и фиксируется количество подряд идущих символов, которые не являются пробелами (т.е. длина слова). Как только встретится пробел, участок строки от этого пробела на длину слова добавляется в конец новой строки. Таким образом, если новая строка изначально пуста, то последнее слово исходной строки окажется первым в новой. Предпоследнее слово исходной строки окажется вторым в новой и т.д.

То, каким образом происходит копирование части строки из исходной и добавление этой части в новую строку, зависит от языка программирования, функций работы со строками.

Pascal

 
var
str: string;

procedure conversely(var s: string);
var
len, i, a: byte;
s2: string;
begin
len := length(s);
a := 0;
s2 := '';
for i:=len downto 1 do begin
if s[i] = ' ' then begin
s2 := s2 + copy(s,i+1,a) + ' ';
a := 0;
end
else
a := a + 1;
end;
s2 := s2 + copy(s,i,a);
s := s2;
end;

begin
readln(str);
conversely(str);
writeln(str);
end.
 

вывести слова в обратном порядке
порядке обратном в слова вывести

Python

вывести строку в обратном порядке python

 
# Вариант 1 - без использования встроенных функций

def conversely(s):
s2 = ''
i = len(s)-1
while i >= 0:
if s[i] == ' ':
s2 = s2 + s[i+1:] + ' '
s = s[:i]
i = len(s) - 1
else:
i -= 1
s2 = s2 + s
return s2

string = input()
string = conversely(string)
print(string)

# Вариант 2 - с использованием встроенных функций Python

def conversely(s):
s = s.split()
s.reverse()
s2 = ' '.join(s)
return s2


string = input()
string = conversely(string)
print(string)
 

каждый охотник желает знать, где сидит фазан
фазан сидит где знать, желает охотник каждый

Basic-256

 
input str$
gosub conversely
print str$
end

conversely:
len = length(str$)
a = 0
s$ = ""
for i=len to 1 step -1
if mid(str$,i,1) = " " then
s$ = s$ + mid(str$,i+1,a) + " "
a = 0
else
a = a + 1
endif
next i
s$ = s$ + mid(str$,1,a)
str$ = s$
return
 

conversely words of string
string of words conversely

Изменить в тексте порядок следования букв|слов|предложений

Изменить порядок следования на обратный для всех символов строки
Программе на вход (в стандартный поток ввода) подаётся целые числа L, R и строка S, состоящая из.

Элементы в новом массиве упорядочены по убыванию или по возрастанию? Если да, то изменить порядок следования элементов
Задача: Даны 2 целочисленные последовательности a и b размером n. Записать в новый массив элементы.

Изменить порядок следования слов в тексте на противоположный
1) Реализовать функцию: int calcWordsCount(const char *text, const char *word, int startFrom =.

Изменить порядок следования букв на обратный
Разработать программу для обработки текстовой информации . Консольный интерфейс программы должен.

Изменить порядок следования слов в строке на обратный
Помогите пожалуйста, рреобразовать строку, изменив порядок следования слов в строке на.

30 / 30 / 22
Регистрация: 13.02.2016
Сообщений: 131

print(''.join([x for x in list(input())[-1::-1]]))

Эксперт NIX

2794 / 2037 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
Надо смотреть текст. Чем разделены предложения?

Эксперт по компьютерным сетям

5890 / 3348 / 1034
Регистрация: 03.11.2009
Сообщений: 9,977

ЦитатаСообщение от Whost Посмотреть сообщение

print(».join([x for x in list(input())[-1::-1]]))
Это Вы так хитро завуалировали

print(input()[::-1])

Регистрация: 30.06.2015
Сообщений: 431
Ребята, только начинаю учить, многое не понятно.

print(''.join([x for x in list(input())[-1::-1]]))

пока не знаю что это.
мой код слова меняет в предложении, вроде как. предложение? к примеру:»My name is Bob. I live in London»

268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено izuchaju_python как решение

Решение

Много уже воды утекло, может уже и поздно, но что-то заморочился я вчера (по камчатскому времени) этой задачей. В результате получилась чуть ли не статья. В общем смотрите:

Всё-таки знаки окончания предложения наверно должны идти в конце предложения.
Принял для себя следующие ограничения по тексту:
1) все предложения завершаются на занки [. ];
2) предложения не завершаются на «. «, «. «, «. » и пр.;
3) в тексте нет пробелов, расположенных друг за другом.
Оттолкнувшись от этих предпосылок написал вот такой скрипт (izuchaju_python, привожу его специально для Вас — он проще всего для понимания и всё ниже следующее — это интерпретации именно этого алгоритма):

1 2 3 4 5 6 7 8 9 10 11 12
# ВАРИАНТ 1 import re data1 = input() data2 = (re.split(r'[. ] |[. ]$', data1)) data2.remove('') # Не успел найти подходящее рег. выр-е, не дающее в конце пустую сроку data3 = (re.findall(r'[. ] |[. ]$', data1)) print('Исходная строка: ', data1) data1 = '' for i in range(len(data2)): data1 = data1 + ((data2[::-1])[i])[::-1] + (data3[::-1])[i] + (' ' if i == 0 else '') print('Трансформированная строка: ', data1)

Посмотрел, порадовался немного. Потом думаю, засмеют — сильно много букв. И переменных. Ещё посидел и родил следующее

1 2 3 4 5 6 7 8
# ВАРИАНТ 2 import re data = input() print('Исходная строка: ', data, '\nТрансформированная строка: ', end='') for i in range(len(re.split(r'[. ] |[. ]$', data)) - 1): print((((re.split(r'[. ] |[. ]$', data))[::-1])[i+1])[::-1] + ((re.findall(r'[. ] |[. ]$', data))[::-1])[i] + (' ' if i == 0 else ''), end='')

Ну вот. Теперь программа в 4 строки написана и с одной переменной. Хорошо. только не оптимально с точки зрения быстродействия (многократные операции с регулярными выражениями в цикле. ) — плохо.
Подумал так и вернулся к первому варианту, модифицировав его сначала так:

1 2 3 4 5 6 7 8 9 10
# ВАРИАНТ 3 import re data1 = input() data2 = list(zip(re.split(r'[. ] |[. ]$', data1, len(re.split(r'[. ] |[. ]$', data1)) - 1), (re.findall(r'[. ] |[. ]$', data1)))) # Отделение знаков препинания от предложений print('Исходная строка: ', data1) data1 = '' for i in range(len(data2)): # Объединение перевёрнутых предложений с не перевёрнутыми знаками препинания data1 += ((data2[::-1])[i][0][::-1]) + (data2[::-1])[i][1] + (' ' if i == 0 else '') print('Трансформированная строка: ', data1)

А потом вот так:

1 2 3 4 5 6 7 8
# ВАРИАНТ 4 import re data1 = input() data2 = list(zip(re.split(r'[. ] |[. ]$', data1, len(re.split(r'[. ] |[. ]$', data1)) - 1), (re.findall(r'[. ] |[. ]$', data1)))) # Отделение знаков препинания от предложений print('Исходная строка: ', data1, '\nТрансформированная строка: ', end = '') for i in range(len(data2)): # Объединение перевёрнутых предложений с не перевёрнутыми знаками препинания print(((data2[::-1])[i][0][::-1]) + (data2[::-1])[i][1] + (' ' if i == 0 else ''), end = '')

Потом подумал и решил попробовать сократить количество переменных до одной, хотя где-то читал, что не рекомендуется таким увлекаться. Видимо из соображений минимизации вероятности ошибки из-за непонимания деталей обработки данных в модуле.
Тем не менее сработало корректно:

1 2 3 4 5 6 7 8
# ВАРИАНТ 5 import re data = input() data = list(zip(re.split(r'[. ] |[. ]$', data, len(re.split(r'[. ] |[. ]$', data)) - 1), (re.findall(r'[. ] |[. ]$', data)))) # Отделение знаков препинания от предложений print('Исходная строка: ', data, '\nТрансформированная строка: ', end = '') for i in range(len(data)): # Объединение перевёрнутых предложений с не перевёрнутыми знаками препинания print(((data[::-1])[i][0][::-1]) + (data[::-1])[i][1] + (' ' if i == 0 else ''), end = '')

Вот на этом моя фантазия иссякла.
Думаю, что из всего описанного третий вариант самый приспособленный к реальной жизни, когда над данными нужно выполнять какие-то следующие операции.
Вот, как бы вот. Не судите строго, помните, что я тоже делаю лишь первые питонские. поползновения?

Добавлено через 3 минуты
Ну и рекомендации по длинам строки не выдержаны, конечно. Что-то забыл про это совсем.

Изменить порядок слов Python

Всем привет! Есть ли библиотека Python, которая меняет порядок слов в предложении? Например у меня есть предложение:

21ис-3 1) Математика 211кб Панфилова 

И при помощи библиотеки можно было бы получить

21ис-3 1) 211кб Математика Панфилова 

Ну или по другому,как уже захочу я
Отслеживать
67.7k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак
задан 30 мая 2022 в 16:41
54 6 6 бронзовых знаков
Для этого не надо никакой библиотеки.
30 мая 2022 в 16:55

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

txt = '21ис-3 1) Математика 211кб Панфилова И' tt = txt.split() print(tt) print(f'   ') ['21ис-3', '1)', 'Математика', '211кб', 'Панфилова', 'И'] 1) 211кб Математика Панфилова 

Отслеживать
ответ дан 30 мая 2022 в 16:51
4,294 4 4 золотых знака 7 7 серебряных знаков 22 22 бронзовых знака
Сплит по пробельным символам дефолтный, можно параметр не указывать
30 мая 2022 в 17:03

  • python
  • порядок
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

5 способов перевернуть строку в Python 3

Создадим функцию reversed1 с аргументом variable , где variable — переменная, хранящая строку, которую мы хотим перевернуть. Так как строка являются неизменяемым объектом, то создадим отдельную, пока что пустую переменную res , которая в будущем будет хранить результат.

def reversed1(variable): res=''

В функцию поместим цикл, который будет «прохаживаться» по каждому из элементов строки. Начнем мы с конца строки, используя положительные индексы, соответственно параметр start функции range — len(variable)-1 . -1 потому, что длина строки всегда на 1 больше, чем индекс последнего ее элемента. Закончить мы должны на первом символе строки, поэтому параметр stop функции range() — -1, поскольку перечисляются числа до значения этого параметра, не включительно. Параметр step — -1, потому что мы считаем в обратном порядке.

def reversed1(variable): res='' for i in range(len(variable)-1,-1,-1): pass

Теперь заполним тело цикла — проведем конкатенацию между старым значением res и элементом строки с индексом i . Таким образом, при каждой итерации цикла мы добавляем по одному символу к результату. После окончания цикла вернем результат.

def reversed1(variable): res='' for i in range(len(variable)-1,-1,-1): res+=variable[i] return res n = reversed1(input()) print(n)

2. Использование цикла со списком в результате

Этот способ аналогичен предыдущему, единственное его отличие заключается в типе данных переменной res — здесь она является списком.

Вместо конкатенации можно использовать метод append() , с помощью которого мы добавляем элемент, указанный в качестве аргумента к методу, в конец списка. Итак, мы получили:

def reversed2(variable): res=[] for i in range(len(variable)-1,-1,-1): res.append(variable[i]) return res

Функция пока что возвращает список, состоящий из односимвольных элементов. Если нас это не устраивает, то почему бы не преобразовать список в строку при помощи метода join() ? Сделаем это, добавив конструкцию res=».join(res) .

def reversed1(variable): res=[] for i in range(len(variable)-1,-1,-1): res.append(variable[i]) res=''.join(res) return res n = reversed1(input()) print(n)

3. Рекурсия

Третий в нашем обзоре способ — рекурсия, как всегда трудная для понимания. Как всегда создаем функцию, но не спешим помещать туда цикл.

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

def reversed3(variable): if len(variable) == 1: return variable

Но если длина строки больше одного, то нужно вернуть последний из ее элементов и вызвать эту же функцию, но уже отрезав последний символ. Сделать это мы можем с помощью среза variable[:-1] . Обновим картину:

def reversed3(variable): if len(variable) == 1: return variable else: return variable[-1] + reversed3(variable[:-1])

Использование else: здесь необязательно, так как после возвращения чего-либо этой функцией она завершится. Поэтому конструкцию return variable[-1] + reverse3(variable[:-1]) можно поместить напрямую в тело функции. Конечный вариант решения:

def reversed3(variable): if len(variable) == 1: return variable return variable[-1] + reversed3(variable[:-1]) n = reversed3(input()) print(n)

4. Использование встроенной функции

В Python 3 встроена специальная функция reversed() , в качестве аргумента она принимает список или строку, а возвращает итератор последовательности значений, состоящей из всех элементов аргумента в обратном порядке.

Простыми словами — недостаточно написать res = reversed(variable) , данные нужно преобразовать в нужный тип (в нашем случае — в строку). Сделать мы это можем при помощи метода join() , соединив последовательность через пустую строку. После выполненных действий возвращаем результат. Код:

def reversed4(variable): res=''.join(reversed(variable)) return res n = reversed4(input()) print(n)

5. Срез строки

Можете представить способ перевернуть строку, который был бы короче названия функции? А я могу!

Срез строки — вещь прекрасная, но порой пугающая новичков «уплотненным» синтаксисом. Срез содержит три параметра — [start:stop:step], аналогично функции range() . Подробнее о них вы можете прочитать в других статьях на Хабре.

Для способа с использованием срезов не нужно даже создавать функцию, только зря строки и время потратите. Все элементарно — присвоим параметру step значение -1 и пропустим два других параметра, происходит магия — строка переворачивается:

n = input()[::-1] print(n)

Конечно, никакой магии здесь нет, мы просто перебираем символы с шагом -1, то есть в обратном порядке.

Заключение

Первый и второй способы как нельзя лучше подходят, если во время переворота строки нужно ее изменять. При этом они значительно уступают 4 и 5 способам в скорости. Читаются умеренно хорошо, поэтому в некоторых случаях их уместно использовать.

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

Четвертый способ довольно быстрый, отлично читается и подходит во многих случаях.

Пятый способ — самый быстрый, хорошо читается, очень краткий (6 символов), поэтому его я считаю наиболее предпочтительным.

Сравнительную таблицу скорости некоторых способов вы можете найти по ссылке — https://python-scripts.com/reversed

Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею — пишите в комментариях, я все прочту и приму к сведению. Удачи!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *