Следующая: , Предыдущая: lists, Вверх: Top


10 Строки

10.1 Строковый тип данных и ввод-вывод строк

Раньше мы имели дело с числовыми данными (целыми и действительными), а также со списками чисел. Другим часто используемым типом данных являются строки. В строковых данных можно хранить фамилии и имена, адреса, названия товаров и т.д. Чтобы задать в программе строку необходимо заключить последовательность символов в двойные кавычки:

     a="У лукоморья дуб зеленый"
     b=""           # Это пустая строка

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

     a=input()
     b=raw_input()

Если в этом примере два раза ввести последовательность символов 2+2, то переменная a будет равна числу 4, а переменная b — строке "2+2".

10.2 Конкатенация строк

Главная операция со строками — их объединение, когда одна строка записывается после другой строки. Эта операция называется конкатенацией и для нее используется оператор +:

     a="abc"
     b="xyz"
     c=a+b
     print c        # Будет напечатано abcxyz

Также при помощи оператора * можно многократно повторять одну и ту же строку. "Умножать" строку можно только на натуральное число:

     print "="*20  # Будет напечатано 20 знаков "=" подряд

10.3 Выбор подстроки

Со строками можно работать во многом как и со списками, рассматривая строку, как список отдельных символов. Функция len для строки возвращает ее длину. Все символы строки пронумерованы начиная с 0, а также в обратном порядке (с конца) начиная с -1. Например, если s="abc", то len(s) возвращает значение 3, s[0] и s[-3] — это символ "a", s[1] и s[-2] — это "b", s[2] и s[-1]— это символ "c". Обращение к несуществующему элементу строки приведет к ошибке IndexError: string index out of range.

     Символ строки:    a   b   c
     Его индекс:       0   1   2
     или такой:       -3  -2  -1

Помимо обращения к отдельным символам строки, из строки можно выбрать подстроку в виде s[x:y], где s — идентификатор строки, x — номер первого символа подстроки, y — номер первого символа, который не будет включен в подстроку. Пример:

     s="abcdefgh"
     print s[2:6]   # Будет напечатано cdef

В этом примере из строки s выбирается подстрока s[2:6], состоящая из символов с индексами от 2 до 5.

При выборе подстроки можно не указать номер начального символа, тогда считается, что он равен 0 (то есть подстрока начинается с начала строки) или последний символ (тогда он считается равным длине строки, то есть подстрока заканчивается концом исходной строки). Также можно использовать отрицательные числа для задания номеров символов. Таким образом, извлечь из строки s первые три символа можно так: s[:3], а последние три символа: s[-3:]. Указание недопустимых для данной строки индексов при выборе подстроки допускается и не приводит к ошибке.

В отличии от списков, изменять отдельные элементы элементы (то есть символы в строке) нельзя. Вместо этого можно пользоваться конкатенацией строк. Например, если хочется в строке s заменить первый символ на букву "a", то это можно сделать при помощи конкатенации строки "a" и всей строки s за исключением первого символа: s="a"+s[1:].

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

     s=raw_input()                # 1
     for i in range(len(s)):      # 2
       if s[i]==" ":              # 3
         print s[:i]              # 4
         break                    # 5

В первой строке программы в переменную s считывается строка с клавиатуры. Затем организовывается цикл, в котором переменная s меняется от 0 до len(s)-1, то есть переменная i принимает подряд все номера символов в строке. В третьей строке программы проверяется, является ли i-й символ строки пробелом (то есть совпадает ли он со строкой из одного пробела). Если проверяемое условие истинно, то был найден первый слева строки пробел, на экран печатается первые i символов строки, то есть все символы с начала строки до найденного пробела, после чего выполнение цикла завершается инструкцией break.

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

Строки можно сравнивать между собой на равенство или неравенство при помощи операторов сравнения == и !=. Также можно сравнивать строки при помощи операторов <, <=, >, >=, при этом строки сравниваются в лексикографическом (то есть алфавитном) порядке. Например, верны будут следующие неравенства: "a"<"aa"<"ab"<"abc"<"c"<"z". При этом сравнение двух отдельных символов осуществляется сравнением номеров, которыми они кодируются в двоичном представлении, в частности, все заглавные латинские буквы будут "меньше" строчных латинских букв, а порядок сравнения русских букв (в системе Linux) будет отличаться от алфавитного.

Приведем пример программы, которая по данной строке выбрасывает из нее все заглавные буквы латинского алфавита:

     s=raw_input()                      # 1
     t=""                               # 2
     for i in range(len(s)):            # 3
         if s[i]>="A" and s[i]<="Z":    # 4
             continue                   # 5
         t=t+s[i]                       # 6
     print t                            # 7

В первой строке программы мы считывает строку s, затем заводим пустую строку t, в которую будем по очереди копировать все символы строки s при условии, что они не являются заглавными буквами. Далее в строке 3 организовывается цикл, в котором переменная i принимает всевозможные значения индексов элементов строки s, то есть от 0 до len(s)-1. Внутри цикла мы проверяем, является ли символ s[i] заглавной буквой, сравнив его со строками "A" и "Z" (строка 4 программы). В случае истинности проверяемого условия пропускаем этот символ (строка 5 программы), иначе выполняется строка 6, в которой в конец строки t дописывается символ s[i]. Завершается программа выводом строки t на экран.

Упражнения

  1. (задание выполняется без компьютера, на листе бумаги и ответ должен иметь вид t=...) По данной строке s получите строку t, которая получается из s
    1. удалением начального символа;
    2. удалением начального и последнего символа;
    3. удалением второго символа;
    4. перестановкой первых трех символов в конец строки;
    5. заменой второго символа на символ "a";
    6. удалением символа с номером k.
    7. разделением строки на две равные части и перестановки их местами (если длина строки — четная).
    8. разделением строки на две равные части и средний символ, перестановка частей местами, при этом средний символ остается на месте (если длина строки — нечетная).
  2. Замените в данной строке все буквы "a" на букву "A".
  3. Удалите из строки все буквы с четными номерами.
  4. Дана строка. Определите, каких букв в ней больше: "a" или "о".
  5. Дана строка. Подсчитайте количество слов в ней, слова разделены одним пробелом.
  6. Проверьте, является ли слово палиндромом (то есть можно ли ее прочитать с конца так же, как и сначала, например, "топот").
  7. Дано слово английского языка, начинающееся с согласной буквы. Проверьте, что в этом слове гласные и согласные буквы чередуются.
  8. Дана строка. Удалите из нее все повторяющиеся буквы (заменить последовательность подряд идущих одинаковых букв на одну такую букву).
  9. Дана слово, в которой ровно две одинаковые буквы. Найдите эти буквы.
  10. Дана строка. Найдите длину самого большого слова в ней, слова разделены одним пробелом.
  11. Дана строка. Найдите наибольшее количество подряд идущих букв "е" в этой строке.
  12. Даны две строки. Проверьте, является ли первая строка подстрокой второй строки.
  13. Проверьте, является ли предложение палиндромом без учета пробелов (пример: "а роза упала на лапу азора").
  14. Дана строка вида "12-23+343+322" (арифметическое выражение, состоящее из цифр и знаков + и -, при этом два знака не идут подряд и выражение завершается цифрой). Вычислите его значение.