Как перемешать символы в строке python
Перейти к содержимому

Как перемешать символы в строке python

  • автор:

Строки

Строка представляет последовательность символов в кодировке Unicode, заключенных в кавычки. Причем для определения строк Python позволяет использовать как одинарные, так и двойные кавычики:

message = "Hello World!" print(message) # Hello World! name = 'Tom' print(name) # Tom

Если строка длинная, ее можно разбить на части и разместить их на разных строках кода. В этом случае вся строка заключается в круглые скобки, а ее отдельные части — в кавычки:

text = ("Laudate omnes gentes laudate " "Magnificat in secula ") print(text)

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

''' Это комментарий ''' text = '''Laudate omnes gentes laudate Magnificat in secula Et anima mea laudate Magnificat in secula ''' print(text)

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

Управляющие последовательности в строке

Строка может содержать ряд специальных символов — управляющих последовательностей или escape-последовательности. Некоторые из них:

  • \ : позволяет добавить внутрь строки слеш
  • \’ : позволяет добавить внутрь строки одинарную кавычку
  • \» : позволяет добавить внутрь строки двойную кавычку
  • \n : осуществляет переход на новую строку
  • \t : добавляет табуляцию (4 отступа)

Используем некоторые последовательностей:

text = "Message:\n\"Hello World\"" print(text)

Консольный вывод программы:

Message: "Hello World"

Хотя подобные последовательности могут нам помочь в некоторых делах, например, поместить в строку кавычку, сделать табуляцию, перенос на другую строку. Но они также могут и мешать. Например:

path = "C:\python\name.txt" print(path)

Здесь переменная path содержит некоторый путь к файлу. Однако внутри строки встречаются символы «\n», которые будут интерпретированы как управляющая последовательность. Так, мы получим следующий консольный вывод:

C:\python ame.txt

Чтобы избежать подобной ситуации, перед строкой ставится символ r

path = r"C:\python\name.txt" print(path)

Вставка значений в строку

Python позволяет встравивать в строку значения других переменных. Для этого внутри строки переменные размещаются в фигурных скобках <>, а перед всей строкой ставится символ f :

userName = "Tom" userAge = 37 user = f"name: age: " print(user) # name: Tom age: 37

В данном случае на место будет вставляться значение переменной userName. Аналогично на вместо будет вставляться значение переменной userAge.

Обращение к символам строки

И мы можем обратиться к отдельным символам строки по индексу в квадратных скобках:

string = "hello world" c0 = string[0] # h print(c0) c6 = string[6] # w print(c6) c11 = string[11] # ошибка IndexError: string index out of range print(c11)

Индексация начинается с нуля, поэтому первый символ строки будет иметь индекс 0. А если мы попытаемся обратиться к индексу, которого нет в строке, то мы получим исключение IndexError. Например, в случае выше длина строки 11 символов, поэтому ее символы будут иметь индексы от 0 до 10.

Чтобы получить доступ к символам, начиная с конца строки, можно использовать отрицательные индексы. Так, индекс -1 будет представлять последний символ, а -2 — предпоследний символ и так далее:

string = "hello world" c1 = string[-1] # d print(c1) c5 = string[-5] # w print(c5)

При работе с символами следует учитывать, что строка — это неизменяемый (immutable) тип, поэтому если мы попробуем изменить какой-то отдельный символ строки, то мы получим ошибку, как в следующем случае:

string = "hello world" string[1] = "R"

Мы можем только полностью переустановить значение строки, присвоив ей другое значение.

Перебор строки

С помощью цикла for можно перебрать все символы строки:

string = "hello world" for char in string: print(char)

Получение подстроки

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

  • string[:end] : извлекается последовательность символов начиная с 0-го индекса по индекс end (не включая)
  • string[start:end] : извлекается последовательность символов начиная с индекса start по индекс end (не включая)
  • string[start:end:step] : извлекается последовательность символов начиная с индекса start по индекс end (не включая) через шаг step
string = "hello world" # с 0 до 5 индекса sub_string1 = string[:5] print(sub_string1) # hello # со 2 до 5 индекса sub_string2 = string[2:5] print(sub_string2) # llo # с 2 по 9 индекса через один символ sub_string3 = string[2:9:2] print(sub_string3) # lowr

Объединение строк

Одной из самых распространенных операций со строками является их объединение или конкатенация. Для объединения строк применяется операция сложения:

name = "Tom" surname = "Smith" fullname = name + " " + surname print(fullname) # Tom Smith

С объединением двух строк все просто, но что, если нам надо сложить строку и число? В этом случае необходимо привести число к строке с помощью функции str() :

name = "Tom" age = 33 info = "Name: " + name + " Age: " + str(age) print(info) # Name: Tom Age: 33

Повторение строки

Для повторения строки определенное количество раз применяется операция умножения:

print("a" * 3) # aaa print("he" * 4) # hehehehe

Сравнение строк

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

str1 = "1a" str2 = "aa" str3 = "Aa" print(str1 > str2) # False, так как первый символ в str1 - цифра print(str2 > str3) # True, так как первый символ в str2 - в нижнем регистре

Поэтому строка «1a» условно меньше, чем строка «aa». Вначале сравнение идет по первому символу. Если начальные символы обоих строк представляют цифры, то меньшей считается меньшая цифра, например, «1a» меньше, чем «2a». Если начальные символы представляют алфавитные символы в одном и том же регистре, то смотрят по алфавиту. Так, «aa» меньше, чем «ba», а «ba» меньше, чем «ca». Если первые символы одинаковые, в расчет берутся вторые символы при их наличии. Зависимость от регистра не всегда желательна, так как по сути мы имеем дело с одинаковыми строками. В этом случае перед сравнением мы можем привести обе строки к одному из регистров. Функция lower() приводит строку к нижнему регистру, а функция upper() — к верхнему.

str1 = "Tom" str2 = "tom" print(str1 == str2) # False - строки не равны print(str1.lower() == str2.lower()) # True

Функции ord и len

Поскольку строка содержит символы Unicode, то с помощью функции ord() мы можем получить числовое значение для символа в кодировке Unicode:

print(ord("A")) # 65

Для получения длины строки можно использовать функцию len() :

string = "hello world" length = len(string) print(length) # 11

Поиск в строке

С помощью выражения term in string можно найти подстроку term в строке string. Если подстрока найдена, то выражение вернет значение True , иначе возвращается значение False :

text = "hello world" exist = "hello" in text print(exist) # True exist = "sword" in text print(exist) # False

Соответственно с помощью операторов not in можно проверить отсутствие подстроки в строке:

text = "hello world" print("hello" not in text) # False print("sword" not in text) # True

Перемешать буквы python

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

В общем случае, слова на буквы можно не только посимвольно (на отдельные Unicode code points) разбивать. См. Как разбить строку на отдельные символы?

Отслеживать
ответ дан 28 дек 2017 в 19:26
52.4k 11 11 золотых знаков 110 110 серебряных знаков 312 312 бронзовых знаков

Могу предложить вот такой вариант:

import random slovo = 'Привет' slovo_list = list(slovo) abrakadabra = random.sample(slovo_list, len(slovo_list)) print(abrakadabra) 

Отслеживать
12.5k 7 7 золотых знаков 19 19 серебряных знаков 48 48 бронзовых знаков
ответ дан 23 фев 2021 в 14:29
Георгий Кротов Георгий Кротов
11 2 2 бронзовых знака
23 фев 2021 в 14:33

Более простой способ:

# Программа, которая меняет местами буквы в слове. # Импортирую модуль random import random # Запрашиваю слово у пользователя. слово = input("Введите слово, в котором вы хотите поменять буквы местами:\n") # Преобразую введённое слово из неизменяемого строкового типа (str) # в изменяемый тип список (list) при помощи функции list() слово = list(слово) # Перемешиваю элементы списка при помощи метода.shuffle random.shuffle(слово) # Создаю переменную строкового типа, в которую будет записываться слово # с перемешанными буквами. перемешанное_слово = "" # При помощи цикла for добавляю последовательно буквы # в созданную пустую переменную (перемешанное_слово). for буква in слово: перемешанное_слово += буква # Вывожу результат на экран. print(перемешанное_слово) 

Как перемешать слова в строках в случайном порядке?

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

И так же отдельно существует ли регулярка которая мешала бы абсолютно все слова в тексте не выходя за лимит10 слов в строке как в оригинале.

  • Вопрос задан более года назад
  • 318 просмотров

3 комментария

Простой 3 комментария

Saboteur @saboteur_kiev
регулярка не умеет мешать слова.
У регулярок другие задачи — найти/заменить.

Регулярки не умеют в рандом, но может быть здесь и не нужен настоящий рандом, а сойдёт «псевдо-случайное» перемешивание внутри каждой строки по заданному алгоритму?

Исходя из условия, что в каждой строке обязательно 10 слов, разделённых пробелами и прикинув набор символов, встречающихся в словах, можно данный набор символов разбить на несколько групп (для каждой группы будет своя регулярка). Далее привязаться к какой-нибудь позиции, например взять третий символ второго слова в строке. Каждая регулярка проверяет соответствие символа на этой позиции заданной группе символов и если true, то слова перемешиваются в заданном порядке. Каждая регулярка перемешивает по своему и после последовательных проходов всеми регулярками на выходе получаем основательно перемешанный текст, но не в случайном порядке, а всё же по алгоритму.

Артём @fishmen Автор вопроса
js-newbie, Звучит сложно,без примера не представляю даже как это сделать.Но спасибо за ответ)
Решения вопроса 1

Регулярки не умеют в рандом, но может быть здесь и не нужен настоящий рандом, а сойдёт «псевдо-случайное» перемешивание внутри каждой строки по заданному алгоритму?

Исходя из условия, что в каждой строке обязательно 10 слов, разделённых пробелами и прикинув набор символов, встречающихся в словах, можно данный набор символов разбить на несколько групп (для каждой группы будет своя регулярка). Далее привязаться к какой-нибудь позиции, например взять третий символ второго слова в строке. Каждая регулярка проверяет соответствие символа на этой позиции заданной группе символов и если true, то слова перемешиваются в заданном порядке. Каждая регулярка перемешивает по своему и после последовательных проходов всеми регулярками на выходе получаем основательно перемешанный текст, но не в случайном порядке, а всё же по алгоритму.

Маск отреагировал заявления текущих острых проблемах разработчиками Twitter публикацией лично
Источники подтвердили экстренное собрание разработчиков квартире куда часть сотрудников прилетели
Маск инженерами пытался понять программную основу Twitter принципы работы платформы
Каждый разработчик встрече показывал объяснял Маску свои самые важные фрагменты

Слова в тексте включают символы кириллицы [А-Яа-я] и стандартные символы латиницы плюс цифры [\w] , получаем набор символов [А-Яа-я\w]

Шаблон для каждой строки из 10 слов:
^([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$

Разбиваем наш набор символов на пять групп:
[А-Я]
[а-д]
[е-м]
[н-я]
[\w]

Привяжемся к третьему символу второго слова в строке (считая, что в этом слове не менее трёх символов). Пять групп — пять регулярок:
1. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w][А-Я][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
1. Заменить
$10 $9 $8 $7 $6 $5 $4 $3 $2 $1
2. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w][а-д][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
2. Заменить
$7 $6 $9 $2 $1 $10 $5 $4 $8 $3
3. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w][е-м][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
3. Заменить
$9 $10 $7 $8 $4 $3 $2 $1 $6 $5
4. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w][н-я][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
4. Заменить
$2 $1 $4 $3 $8 $7 $10 $9 $5 $4
5. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w][\w][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
5. Заменить
$3 $5 $10 $1 $9 $8 $6 $7 $4 $2

На выходе получаем что-то вроде:

отреагировал Маск текущих заявления Twitter разработчиками лично публикацией острых текущих
куда квартире сотрудников подтвердили Источники прилетели разработчиков собрание часть экстренное
работы платформы Twitter принципы понять пытался инженерами Маск основу программную
важные фрагменты свои самые показывал встрече разработчик Каждый Маску объяснял

Как перемешать символы в сроке?

YakovSpb, я тоже не вижу никакого смысла в перемешивании 8 случайных групп. Но это не я сформулировал конкатенацию в фиксированном порядке.

ScriptKiddo

ScriptKiddo @ScriptKiddo

SELECT string_agg(unnest, '') FROM( select * FROM (select unnest(string_to_array(string_agg(concat( substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil(random() * 26)::integer, 1), substring('abcdefghijklmnopqrstuvwxyz', ceil(random() * 26)::integer, 1), substring('0123456789', ceil(random() * 10)::integer, 1), substring('!#$%&()*+,-./:;?@[]^', ceil(random() * 23)::integer, 1) ), ''), NULL)) FROM generate_series(1,8)) x ORDER BY RANDOM()) as random_chars

Держи, только никому это не показывай XD

Ответ написан более двух лет назад
Комментировать
Нравится Комментировать

rozhnev

Fullstack programmer, DBA, медленно, дорого
Ваша настойчивость впечатляет:

select string_agg(substring, '') from ( SELECT substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil(random() * 26)::integer, 1) FROM generate_series(1,12) -- 12 capital letters union SELECT substring('abcdefghijklmnopqrstuvwxyz', ceil(random() * 26)::integer, 1) FROM generate_series(1,12) -- 12 low case letters union SELECT substring('0123456789', ceil(random() * 10)::integer, 1) FROM generate_series(1,6) -- 6 digits union SELECT substring('!#$%&()*+,-./:;?@[]^', ceil(random() * 23)::integer, 1) FROM generate_series(1,2) -- 2 other chars ) seria;

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

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