Перейти к содержанию

Методы списков и строк

Мы уже знакомы с некоторыми функциями для работы со списками, строками и множествами. Мы знаем также методы для работы с элементами множеств (add, remove, discard и т. д.), метод append, который позволяет добавлять элементы в список, метод split для разбиения строки на список «слов» и метод join для «сшивки» списка строк в одну. Однако мы не знаем, как делать со списками многие другие вещи: добавлять элементы в произвольное место, удалять элементы и т. д. Такие задачи решаются с помощью других функций и методов.

Далее приводится перечень основных методов списков и строк, а также функций и специальных синтаксических конструкций для работы с ними, включая уже знакомые нам. Если при написании программы вы забудете, как называется тот или иной метод или какие у него аргументы, смело заглядывайте в материалы этого урока, в документацию, пользуйтесь поиском в Интернете или описанными здесь функциями dir и help.

В таблице предполагается, что: - a и a2 — списки; - x — элемент списка; - s и s2 — строки; - c — символ (строка длины 1); - n — индекс элемента списка или строки; - start, stop, step — границы среза (т. е. тоже индексы) и шаг среза; - k — натуральное число.

Для методов и функций также даны примеры выражений, которые будут истинными True и демонстрируют действие этого метода. Например, выражения 5 in [2, 3, 5] и 'abc'.isalpha() равны True. Их можно подставить в оператор if (и соответствующий блок будет выполнен) или в функцию print (и тогда она выведет True).

Методы списков

Операция Описание Пример
x in a Проверка, что x содержится в а 5 in [2, 3, 5]
x not in a Проверка, что x не содержится в а 5 not in [2, 3, 6]
a + a2 Конкатенация списков [2, 4] + [5, 3] == [2, 4, 5, 3]
a * k Список a, повторенный k раз [2, 3] * 3 == [2, 3, 2, 3, 2, 3]
a[n] n-й элемент списка, отрицательные n для отсчёта с конца [2, 3, 7][0] == 2
a[start:stop:step] Срез списка [2, 3, 7][:2] == [2, 3]
len(a) Длина списка len([2, 3, 7]) == 3
max(a) Максимальный элемент max([2, 3, 7]) == 7
min(a) Минимальный элемент min([2, 3, 7]) == 2
sum(a) Сумма элементов sum([2, 3, 7]) == 12
a.index(x) Индекс первого вхождения x [2, 3, 7].index(7) == 2
a.count(x) Количество вхождений x [2, 7, 3, 7].count(7) == 2
a.append(x) Добавить x в конец a.append(8)
a.extend(a2) Добавить элементы коллекции a2 в конец a.extend([8, 4, 5])
del a[n] Удалить n-й элемент del a[1]
del a[start:stop:step] Удалить элементы по срезу del a[:2]
a.clear() Удалить все элементы a.clear()
a.copy() Копия списка b = a.copy()
a += a2 Заменить содержимое на объединение a и a2
a *= k Заменить содержимое на повторение a k раз
a.insert(n, x) Вставить x в a на позицию n a.insert(0, 8)
a.pop(n) Получить n-й элемент и удалить его a.pop(1) == 3
a.remove(x) Удалить первое вхождение x в a a.remove(3)
a.reverse() Изменить порядок элементов на обратный a.reverse()
a.sort() Отсортировать список по возрастанию a.sort()
a.sort(reverse=True) Отсортировать список по убыванию a.sort(reverse=True)
bool(a) Проверка на непустоту

Методы строк

Обратите внимание: никакие методы строк, включая s.replace(...), не изменяют саму строку s. Все они лишь возвращают измененную строку, в отличие от большинства методов списков. a.sort(), например, ничего не возвращает, а изменяет сам список a.

Операция Описание Пример
s2 in s Проверка, что подстрока s2 содержится в s 'm' in 'team'
s2 not in s Проверка, что подстрока s2 не содержится в s 'z' not in 'team'
s + s2 Конкатенация (склейка) строк 'tea' + 'm' == 'team'
s * k Строка s, повторённая k раз 'ha' * 3 == 'hahaha'
s[n] n-й элемент строки, отрицательные n для отсчёта с конца 'team'[2] == 'a'
s[start:stop:step] Срез строки 'mama'[:2] == 'ma'
len(s) Длина строки len('abracadabra') == 11
s.find(s2) Индекс начала первого вхождения подстроки, -1 если нет s.find('ab') == 0
s.rfind(s2) Индекс начала последнего вхождения подстроки s.rfind('ab') == 7
s.count(s2) Количество неперекрывающихся вхождений s2 в s 'abracadabra'.count('a') == 5
s.startswith(s2) Проверка, что s начинается с s2 'abracadabra'.startswith('abra') == True
s.endswith(s2) Проверка, что s оканчивается на s2 'abracadabra'.endswith('abra') == True
s += s2 Заменить содержимое строки на s + s2
s *= k Заменить содержимое строки на s * k
s.isdigit() Проверка, что в строке s все символы — цифры '100'.isdigit() == True
s.isalpha() Проверка, что все символы — буквы 'abc'.isalpha() == True
s.isalnum() Проверка, что все символы — цифры или буквы 'E315'.isalnum() == True
s.islower() Проверка, что не встречаются большие буквы 'hello!'.islower() == True
s.isupper() Проверка, что не встречаются маленькие буквы '123PYTHON'.isupper() == True
s.lower() Все буквы приведены к нижнему регистру 'Привет!'.lower() == 'привет!'
s.upper() Все буквы приведены к верхнему регистру 'Привет!'.upper() == 'ПРИВЕТ!'
s.capitalize() Первая буква — заглавная 'привет'.capitalize() == 'Привет'
s.lstrip() Удалены символы пустого пространства в начале ' Привет!'.lstrip() == 'Привет!'
s.rstrip() Удалены символы пустого пространства в конце 'Привет! '.rstrip() == 'Привет!'
s.strip() Удалены символы пустого пространства с обеих сторон ' Привет! '.strip() == 'Привет!'
s.ljust(k, c) Добавляет справа нужное количество символов c 'Привет'.ljust(8, '!') == 'Привет!!'
s.rjust(k, c) Добавляет слева нужное количество символов c 'Привет'.rjust(8, '!') == '!!Привет'
s.join(a) Склеивает строки из списка a через символ s '+'.join(['Вася', 'Маша']) == 'Вася+Маша'
s.split(s2) Список всех слов строки (подстроки, разделённые s2) 'Раз два три!'.split('а') == ['Р', 'з дв', ' три']
s.replace(s2, s3) Все вхождения s2 заменены на s3 'Раз два три!'.replace('а', 'я') == 'Ряз двя три!'
list(s) Список символов из строки s list('Привет') == ['П', 'р', 'и', 'в', 'е', 'т']
bool(s) Проверка, что строка не пустая
int(s) Получить целое число из строки s int('25') == 25
float(s) Получить дробное число из строки s float('25.4') == 25.4
str(x) Представить любой объект x в виде строки str(25) == '25'

Функции dir и help

Для получения информации о списке методов любого объекта (в том числе тех, о которых вы вряд ли хотели узнать) в Python существует специальная функция dir. Например, dir([]) вернет все методы списков, и оператор print(dir([])) выведет длинный список, оканчивающийся так: index, insert, pop, remove, reverse, sort.

1
2
3
4
dir([])
print(dir([]))
help([])
help([].insert)

Если же нам нужно узнать справочную информацию по конкретному методу или типу данных, для этого существует функция help. help([]) выведет на экран много информации, большая часть которой пока лишняя. А вот help([].insert) выведет на экран краткую справку именно по методу insert, подсказывая, что первый аргумент этого метода — индекс, а второй — тот объект, который нужно вставить в список на этот индекс.

Форматированный вывод. f-строки

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

Начиная с версии 3.6 в Python появился новый тип строк — f-строки, которые улучшают читаемость кода и работают быстрее других способов форматирования.

f-строки, которые буквально означают formatted string, задаются с помощью литерала f перед кавычками.

"обычная строка"
f"f-строка"

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

1
2
3
name = "Аркадий"
age = 14
print(f"Меня зовут {name} Мне {age} лет.")

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

1
2
3
4
5
f"Меня зовут {name}"
f"Третий месяц в году - {month[2]}"
f"Имя: {name.upper()}"
f"({x} + {y}) / 2 = {(x + y) / 2}"
f"13 / 7 = {round(13/7)}"

Кроме того, вы можете задавать форматирование для чисел.

  • Указать необходимое количество знаков после запятой, спецификатор f отвечает за вывод чисел с плавающей точкой (тип float).
print(f"Число пи по Архимеду - {(22/7):.2f}")
  • Представить результат в двоичной системе счисления, используя спецификатор b. Аналогично для шестнадцатеричной системы счисления используется спецификатор x, а для восьмеричной — o.
print(f"10 в двоичной системе счисления - {(10):b}")

Аналогично для шестнадцатеричной системы счисления используется спецификатор x, а для восьмеричной — o.

Ещё с помощью f-строк можно выравнивать выводимый текст по правому краю, левому краю или по центру. Тоже иногда очень удобно такую штуку использовать.

1
2
3
4
value = 42
print(f"Число | {value:>10}|")  # по правому краю
print(f"Число | {value:<10}|")  # по левому краю
print(f"Число | {value:^10}|")  # по центру

Второй метод форматирования строк в Python — это использование строкового метода .format().

Этот способ предлагает более мощный и читаемый синтаксис по сравнению со старым форматированием через знак процента.

1
2
3
name = "Иван"
age = 25
print("Имя: {}, возраст: {}".format(name, age))

Тут можно использовать аргументы в произвольном порядке, просто нумеруя их и используя эти номера в строке шаблона:

print("Возраст {1}, имя {0}".format(name, age))

а также можно давать имена параметрам, что повышает читаемость, а читаемость очень и очень важна:

print("Имя: {n}, возраст: {a}".format(n=name, a=age))

Тут тоже можно форматировать числа, как и в случае со старым форматированием через процент:

1
2
3
4
number = 1234.56789
print("Округлённое число: {:.2f}".format(number))
# этот формат рекомендую просто запомнить — это наиболее частое
# форматирование чисел с плавающей запятой

Отлично! Повторюсь, что форматирование через процент и использование метода format — это всё-таки старые способы форматирования в Python, которые тоже нужно знать, но которые на практике в новом коде я бы сейчас не использовал.

Цепочки вызовов

Бывает удобно строить последовательные цепочки вызовов методов.

s.strip().lower().replace('ё', 'е')
'мало Средне МНОГО'.lower().split().index('средне')

Например, s.strip().lower().replace('ё', 'е') выдаст строку s, в которой убраны начальные и конечные пробелы, все буквы сделаны маленькими, после чего убраны все точки над Ё. В результате этого преобразования строка Зелёный клён превратится в зеленый клен.

В данном примере строка сначала полностью приводится к нижнему регистру (все буквы маленькие) при помощи метода lower(). Затем она превращается в список слов при помощи split(). Далее метод index находит в этом списке слово «средне» на позиции номер 1.

Использование методов списков. Структура данных «Стек»

Приведем пример использования методов списков append и pop для моделирования структуры данных «Стек». Эта структура данных часто используется при решении различных задач (например, при вычислении выражений).

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

Структура данных называется стек (stack, что и значит «стопка»). По-английски такую организацию данных называют LIFO — Last In First Out — Первым Пришел Последним Ушел!

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

Так, в примере ниже порядок вывода будет обратным порядку ввода:

1
2
3
4
5
6
stack = []
for i in range(5):
    print('Какую футболку вы кладёте сверху стопки?')
    stack.append(input())
while stack:  # пока стопка не закончилась
    print('Сегодня вы надеваете футболку', stack.pop())
Какую футболку вы кладёте сверху стопки?
белую
Какую футболку вы кладёте сверху стопки?
красную
Какую футболку вы кладёте сверху стопки?
синюю
Какую футболку вы кладёте сверху стопки?
зеленую
Какую футболку вы кладёте сверху стопки?
веселую
Сегодня вы надеваете футболку веселую
Сегодня вы надеваете футболку зеленую
Сегодня вы надеваете футболку синюю
Сегодня вы надеваете футболку красную
Сегодня вы надеваете футболку белую

Здесь использовалась конструкция while stack:. В условии оператора if или while любой объект интерпретируется как bool: либо как True, либо как False. В случае списков и строк в False превращаются только [] и '' соответственно (а в случае чисел — только ноль).

Иными словами, можно было бы написать while bool(stack): или while stack != []: и получить тот же самый результат, но самый короткий и общепринятый вариант — просто while stack:.


Задачи

Задача 1

Найдите, в каких строках из введённых и в каком месте упоминается кот. Для каждой строки, содержащей слово «кот», выведите номер строки и позицию вхождения.

Тест 1:

Ввод:

3
локоть
молоко
пёс и кот
Вывод:
1 3
3 7


Задача 2

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

Тест 1:

Ввод:

окажем скорейшее вспомоществование
Вывод:
17


Задача 3

Найдите сумму чисел из введённого набора от данного номера до данного номера (включительно, нумерация с 0).

Тест 1:

Ввод:

9 4 8 100 8000 444
2 4
Вывод:
8108


Задача 4

Найдите сумму квадратов чисел из введённого набора от данного номера до данного номера (включительно, нумерация с 0).

Тест 1:

Ввод:

9 4 8 100 8000 444
2 4
Вывод:
64010064


Задача 5

Напишите программу, которая удаляет из программы на языке Python комментарии (строки, начинающиеся с #, и всё после # в середине строки), а также символы пустого пространства на конце строк.

Тест 1:

Ввод:

3
##2
name = input()
print('Привет,', name) # здороваемся
Вывод:
name = input()
print('Привет,', name)


Задача 6

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

Тест 1:

Ввод:

Мир будет наш
Вывод:
М-И-Р Б-У-Д-Е-Т Н-А-Ш


Задача 7

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

Тест 1:

Ввод:

7 2 3 * -
Вывод:
1

Тест 2:

Ввод:

10 15 - 7 *
Вывод:
-35


Задача 8

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

Тест 1:

Ввод:

Баобаб
Вывод:
б


Задача 9

Считайте букву и текст. Выведите слова текста, в которых встречается данная буква (без учёта регистра).

Тест 1:

Ввод:

m
Mary had a little lamb.
Вывод:
Mary lamb.


Задача 10

Напишите программу, которая считает количество печатаемых (не пробельных) знаков в строке.

Тест 1:

Ввод:

Раз два три
Вывод:
9


Задача 11

Считайте n строк, каждая из которых содержит набор чисел через пробел. Для каждой строки определите, можно ли из этих чисел (каждое используется не более одного раза) построить убывающую последовательность. Выведите ДА или НЕТ.

Тест 1:

Ввод:

2
4 3 2 1
3 4 1 3 2
Вывод:
ДА
НЕТ

Тест 2:

Ввод:

3
10 5 4 3
5 7 6 1
3 2 1 3 2 1
Вывод:
ДА
НЕТ
НЕТ


Задача 12

Напишите программу, которая находит рекордное количество подряд идущих одинаковых символов в строке.

Тест 1:

Ввод:

Длинношеееед
Вывод:
4