Срезы строк [ Python 3 ]
Срезы строк
Иногда нужно бывает работать с целыми частями строки, в таком случае мы используем срезы (slices). Срезы похожи на комбинацию индексации и функции range()
.
Рассмотрим строку s = 'abcdefghij'
.
Положительные индексы | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
Строка | a | b | c | d | e | f | g | h | i | j |
Отрицательные индексы | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
С помощью среза мы можем получить несколько символов исходной строки, создав диапазон индексов разделенных двоеточием s[x:y]
.
Следующий программный код:
print(s[2:5])
print(s[0:6])
print(s[2:7])
выводит:
cde
abcdef
cdefg
При построении среза s[x:y]
первое число – это то место, где начинается срез (включительно), а второе – это место, где заканчивается срез (невключительно). Разрезая строки, мы создаем подстроку, которая по сути является строкой внутри другой строки.
Срез до конца, от начала
Если опустить второй параметр в срезе s[x:]
(но поставить двоеточие), то срез берется до конца строки. Аналогично если опустить первый параметр s[:y]
, то можно взять срез от начала строки. Срез s[:]
совпадает с самой строкой s
.
Следующий программный код:
print(s[2:])
print(s[:7])
выводит:
cdefghij
abcdefg
Срез s[:]
возвращает исходную строку.
Отрицательные индексы в срезе
Мы также можем использовать отрицательные индексы для создания срезов. Как уже говорилось ранее, отрицательные индексы строки начинаются с -1
и отсчитываются до достижения начала строки. При использовании отрицательных индексов первый параметр среза должен быть меньше второго, либо должен быть пропущен.
Следующий программный код:
print(s[-9:-4])
print(s[-3:])
print(s[:-3])
выводит:
bcdef
hij
abcdefg
Удалить из строки последний символ можно при помощи среза s[:-1]
.
Шаг среза
Мы можем передать в срез третий необязательный параметр, который отвечает за шаг среза. К примеру, срез s[1:7:2]
создаст строку bdf
состоящую из каждого второго символа (индексы 1, 3, 5
, правая граница не включена в срез).
Отрицательный шаг среза
Если в качестве шага среза указать отрицательное число, то символы будут идти в обратном порядке.
Следующий программный код:
print(s[::-1])
выводит:
jihgfedcba
Следующий программный код:
print(s[1:7:2])
print(s[3::2])
print(s[:7:3])
print(s[::2])
print(s[::-1])
print(s[::-2])
выводит:
bdf
dfhj
adg
acegi
jihgfedcba
jhfdb
Подводя итог
Программный код | Результат | Пояснение |
---|---|---|
s[2:5] |
cde |
строка состоящая из символов с индексами 2, 3, 4 |
s[:5] |
abcde |
первые пять символов строки |
s[5:] |
fghij |
строка состоящая из символов с индексами от 5 до конца |
s[-2:] |
ij |
последние два символа строки |
s[:] |
abcdefghij |
вся строка целиком |
s[1:7:2] |
bdf |
строка состоящая из каждого второго символа с индексами от 1 до 6 |
s[::-1] |
jihgfedcba |
строка в обратном порядке, так как шаг отрицательный |
Изменение символа строки по индексу
Предположим, у нас есть строка s = 'abcdefghij'
и мы хотим заменить символ с индексом 4 на 'X'
. Можно попытаться написать код:
s[4] = 'X'
Однако такой код не работает. В Python строки являются неизменяемыми, то есть мы не можем менять их содержимое с помощью индексатора.
Если мы хотим поменять какой-либо символ строки s
, мы должны создать новую строку. Следующий код использует срезы и решает поставленную задачу:
s = s[:4] + 'X' + s[5:]
Мы создаем два среза: от начала строки до 3 символа и с 5 символа по конец строки, а между ними вставляем нужный нам символ, который встанет на 4 позицию.
Примечания
Примечание 1. Синтаксис срезов строк очень похож на синтаксис функции range()
.
Примечание 2. Если первый параметр среза больше второго, то срез создает пустую строку.