Python. Работа с текстом. Строки.

На уроке «Python. Взлом шифров. продолжение-2» я обещал рассказать о работе с текстом. Начнем со строк. Строки в Python-е, как и в PHP и JavaScript, могут заключаться в двойные или одинарные кавычки:

s1="Это строка"
s2='Это тоже строка'

print (s1)
print (s2)

Это позволяет создать строки с кавычками внутри (либо с апострофами внутри):

s1="Внутри кавычек могут быть 'апостофы' ''''"
s2='А внутри апостофов "кавычки"   """ '

print (s1)
print (s2)

Еще есть такая фича, как тройные кавычки. Они позволят задать многострочный стринг:

s="""Это первая строка
а это вторая
и третья
и четвертая"""

print (s)

Другой способ задания многострочного текста — это использование символов «\n», хотя первый способ зачастую более наглядный. Вот этот код выполнит тоже самое:

s="Это первая строка\nа это вторая\nи третья\nи четверая"
print (s)

Строки можно складывать (конкатенация):

s="Hello "+"word"

print (s)

Можно умножить строку на число, в этом случае она дублируется столько раз, на сколько ее умножили:

s="Hello "*3
print (s)

Но при попытке умножить на дробное число выйдет ошибка:

«Traceback (most recent call last):
File «D:/Самообразование/Python работа с тектом/text6.py», line 3, in <module>
s=»Hello «*3.1
TypeError: can’t multiply sequence by non-int of type ‘float'»

Аналогично не «прокатит» и умножение строки на строку, так как данная операция не имеет смысла.

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

s=3*"Hello "
print (s)

Такой код выдаст тоже самое, что и предыдущий. А вот со сложением данный номер не пройдет, так как там просто  вторая строка с конца присоединяется к перовой.

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

s="Hello, world! "
print (s[5])

Можно использовать срез. Например, вот такая программа вернет «lo,»:

s="Hello, world! "
print (s[3:7])

Самый прикол, что можно получить каждый второй, каждый третьи и так далее символ из среза, например, каждый второй:

s="Hello, world! "
print (s[1:10:2])

Такая программа вернет строку: «el,wr», а вот такая:

s="Hello, world! "
print (s[1:10:3])

Вернет: «eow».

А еще в срезе могут быть отрицательные значения, это значит, что брать надо с конца. Например, если мы хотим получить предпоследний символ, мы можем написать [-2]. А вот если обратиться так: [:-2] то программа вернет все символы, кроме последних двух.

Теперь пара практических задач.

Задача 1. Дана строка со списком слов, разделенных пробелами. Надо найти самое длинной слово.

Решение. Вспомним урок Python. Взлом шифров. Продолжение, где для распарсиваняи строки мы использовали split. Тут поступим точно так же, распарсим строку, превратив ее в список, переберем все элементы списка, используя классический алгоритм поиска максимума:

s="а на к в игра слово параллелепипед велосипед в не у компьютер"
ls=s.split(" ")
max_len=0
word=""
for el in ls:
    word_len=len(el)
    if word_len>max_len:
        max_len=word_len
        word=el

print("Слово с максимальной длиной: "+word)

Программа вернет «Слово с максимальной длиной: параллелепипед».

Задача 2. Необходимо анализировать сигнал. Этот сигнал состоит из цифр от 0 до 9 и знака #. Две и более идущие цифры подряд обозначают эту цифру. Если цифра должна повторяться, то это обозначается двумя или более знаками # (предыдущая цифра повторяется). Одинарная цифра или знак # считается помехой и не должен учитывается. Например, сочетание «12233##577766###» обозначает «233766».

Решение. Будем анализировать строку сигнала в цикле, меняя режим цикла, если идут два и более символа подряд. Последний символ и последнюю цифру запоминаем. Символ запоминаем чтобы отследить, что иду два и более подряд, а цифру для того, чтобы знак «#» удвоил ее.

Вот такая получается программа:

source_str="12233##577766###"
last_digit=""
last_simbol=""
dist_str=""
str_len=len(source_str)
i=0
is_wait=True
while i<str_len:
    simb=source_str[i]
    if simb==last_simbol:
        if not is_wait:
            if simb=="#":
                dist_str=dist_str+last_digit
            else:
                dist_str=dist_str+simb
                last_digit=simb
            is_wait=True
    else:
        is_wait=False
        last_simbol=simb
    i=i+1

print(dist_str)

 

Comments

So empty here ... leave a comment!

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

Sidebar