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

Как делать срез в python

  • автор:

#8 – Функции строк. Индексы и срезы

#8 – Функции строк. Индексы и срезы

Язык Питон обладает обширным набором функций для работы со строками. В ходе урока мы научимся использовать множество из этих функций, а также изучим тему индексов и срезов в языке Python.

Видеоурок

Индексы

Нумерация в списках начинается с нуля, так как список по большей части это просто массив, то как в обычном массиве отсчет ведется от 0. Первый элемент по индексу будет 0, второй — 1, третий — 2 и так далее. Если мы попытаемся взять несуществующий элемент, то это приведет к ошибке.

a = [0, 23, "Hi"] # Список print (a[4]) # Выдаст ошибку, так как элемента не существует

Удобной функцией языка Python является возможность брать элементы с конца при помощи отрицательных индексов. К примеру, если нам нужен второй элемент с конца, то мы можем записать это так:

a = [0, 23, "Hi", 1.56, 9] # Список print (a[-2]) # Будет выведено 1.56
Срезы

Срезы позволяют обрезать список, взяв лишь те элементы, которые нужны. Они работают по следующей схеме: list[НАЧАЛО:КОНЕЦ:ШАГ] .

  • Начало — с какого элемента стоит начать (по умолчанию равно 0);
  • Конец — по какой элемент мы берем элементы (по умолчанию равно длине списка);
  • Шаг — с каким шагом берем элементы, к примеру каждый 2 или 3 (по умолчанию каждый 1).

В срезах один, несколько или даже все параметры могут быть пропущены.

list[::3] # Берем каждый третий элемент list[2::2] # Начиная со второго элемента берем каждый второй элемент list[4:6:] # Начиная с 4 элемента берем все элементы по 6 элемент list[::] # Берем все элементы

Также могут быть использованы отрицательные числа для срезов.
Функции по работе со строками

word = 'FootBALL, baskeTball, skate' # print(word.count('!')) # print(word.capitalize()) # print(word.find('pr')) hobby = word.split(', ') for i in range(len(hobby)): hobby[i] = hobby[i].capitalize() result = ", ".join(hobby) print(result)
Посмотреть остальной код можно после подписки на проект!

Задание к уроку

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

Большое задание по курсу

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

Также стоит посмотреть

Разработка игр на Python с нуля / Уроки Pygame

Уроки ChatGPT API / Разработка программ на Python и ChatGPT

Разработка Telegram Ботов на Python

Нейронные сети / Изучение Python OpenCV

Изучение Python UI (GUI Apps) / Программы на Питон

Комментарии (8)

Николай 15 марта 2023 в 18:59

Какое отношение первое задание имеет к этой тем. В уроке функция enumate вообще не рассматривалась.

Anna 10 февраля 2023 в 17:06

Выведите в списке третий элемент с конца
list_2 = [3.4, 56, «Some», «Hi», 7, 3.8, 44]
print(list_2[-3])

Anna 10 февраля 2023 в 17:03

используйте функцию enumerate.

Anna 10 февраля 2023 в 17:03

Выведите каждый 3 элемент списка начиная с первого и заканчивая предпоследним.

list = [3.4, 56, «Some», «Hi», 7, 3.8, 44]
print(list[:-1:3])

Муса 04 февраля 2023 в 19:44

У вас написано list[2::2] # Начиная со ВТОРОГО элемента. А там с третьего

Zakhar 21 января 2023 в 22:50

 import random print("Welcome to casino XBET!") user_logins = [''] user_passwords = [''] user_choose = input(('Choose registration or log into: ')) if user_choose == 'registration': user_logins.append(input('Create your login: ')) user_passwords.append(input('Create your password: ')) user_enter_login = input('Enter your login: ') if user_enter_login in user_logins: print('The login is Wright') else: print('The login is wrong') user_enter_password = input('Enter your password: ') if user_enter_password in user_passwords: print("The password is right") else: print('The password is wrong') elif user_choose == 'log into': user_enter_login = input('Enter your login: ') if user_enter_login in user_logins: print('The login is Wright') else: print('The login is wrong') user_enter_password = input('Enter your password: ') if user_enter_password in user_passwords: print("The password is right") else: print('The password is wrong') else: exit() balance = 100 print('Your balance = ', balance) while balance > 0: user_num = int(input("Enter your number 1-10: ")) if user_num == random.randrange(1,10): balance += 10 print('You won 10 USD') print('Your balnce is: ', balance) else: balance -= 10 print("You lose 10 USD") print("Your balance is: ", balance) 

Сделал мини казино с тех знаний которые получил

Борис 18 июля 2023 в 15:39

Антон 12 ноября 2023 в 21:42

Shakhboz 24 декабря 2022 в 17:35

What is enumerate? At least, explain in text. There is nothing about it in the video. Thanks!

Андрей 20 октября 2022 в 12:19

enumerate вообще никак не объясняется в видео. Чтобы решить задание, нужно искать инфу в инете. Странный подход к обучению)

Срезы в Python

Скорее всего, вы уже знакомы со срезами. В предыдущих статьях мы касались слайсинга списков.

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

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

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] # извлекаем данные print(colors[1:3]) # присваиваем новые значения colors[1:3] = ['розовый', 'черный'] print(colors)

Вывод

['зеленый', 'синий']
['красный', 'розовый', 'черный', 'оранжевый']

Однако срезы можно использовать для извлечения данных и из неизменяемых последовательностей. Например:

topic = 'Срезы в Python' # извлекаем данные print(topic[0:6])

Вывод

Срезы

Если вы попытаетесь использовать срезы для присвоения данных неизменяемой последовательности, Python сообщит об ошибке. Например:

topic[0:6] = 'Списки' # ошибка TypeError: 'str' object does not support item assignment 

Срез последовательность[начало:конец] возвращает элементы с индекса начало до индекса конец — 1 .

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

Срез — это объект

В Python все является объектом, в том числе — срезы.

Когда вы используете синтаксис срезов:

последовательность[начало:конец]

. на самом деле начало:конец — объект класса slice.

slice(начало, конец)

Давайте убедимся в этом с помощью функции type() :

s = slice(1, 3) print(type(s)) print(s.start, s.stop)

Вывод

Тот факт, что срезы являются объектом типа slice, позволяет не использовать классический синтаксис срезов

colors[1:3]

. а, например, использовать срез как объект:

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] s = slice(1, 3) print(colors[s])

Вывод

['зеленый', 'синий']

Границы срезов

Срез последовательность[начало:конец] выбирает элементы, чей индекс находится в промежутке между с индексами начало и конец (не включая элемент с индексом конец ).

Другими словами, он возвращает все элементы последовательности по индексу n , где n удовлетворяет следующему выражению:

начало 

Если начало или конец больше, чем длина последовательности, Python использует len(последовательность) вместо начало или конец соответсвенно.

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

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[0:100])

Вывод

['красный', 'зеленый', 'синий', 'оранжевый']

Обе границы начало и конец опциональные. Если их не указывать, будут использованы зачения по умолчанию: начало — 0, конец — len(последовательность) .

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[10:])

Вывод

['красный', 'зеленый', 'синий', 'оранжевый']

Не указали верхнюю границы — все равно вывелся весь списка.

Отрицательные границы срезов

Объект slice также принимает отрицательные начальные и конечные границы.

В следующем примере для слайсинга списка используются отрицательные начальные и конечные границы:

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[-4:-2]) 

Вывод

['красный', 'зеленый']

Чтобы получить элементы 'синий' и 'оранжевый' из списка colors , можно объединить отрицательные и положительные границы:

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[-2:4])

Вывод

['синий', 'оранжевый']

Шаг в срезах

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

последовательность[начало:конец:шаг]

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

s = slice(начало, конец, шаг) последовательность[s]

Пример

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[0:4:2])

Вывод

['красный', 'синий']

Метод indices()

Объект slice по сути определяет последовательность индексов для выбора элементов последовательности.

Чтобы сделать выбор элементов более удобным, у класса slice есть метод indices() , который возвращает эквивалентный диапазон (начало, конец, шаг) для любого среза последовательности с заданной длиной:

slice(начало, конец, шаг).indices(длина) # вернется кортеж (i, j, k) 

Вы можете использовать значения кортежа, который возвращает indices() для создания списка индексов с помощью функции range() . Например:

colors = ['красный', 'зеленый', 'синий', 'оранжевый'] s = slice(0, 4, 2) t = s.indices(len(colors)) for index in range(*t): print(colors[index])

Вывод

красный
синий

Как это работает

  1. Создается объект slice со следующими параметрами: начало — 0, конец — 4, шаг — 2.
  2. Возвращается кортеж индексов среза последовательности, длина которого равна длине списка colors .
  3. Кортеж передается в функцию range() для выбора элементов из списка colors .

Что нужно запомнить

  • Срезы работают только для последовательностей: изменяемых и неизменяемых.
  • Срез — это объект класса slice.

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 © ООО "Алгоритмы и практика"

Срезы — Python: Списки

Работать с одиночными элементами вы уже умеете. Настало время перейти к очень интересному инструменту, который Python предоставляет для работы с целыми подмножествами элементов списка: к так называемым срезам (slices).

Синтаксис описания срезов

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

some_list[START:STOP:STEP] 

Всего у среза три параметра:

  • START — индекс первого элемента в выборке
  • STOP — индекс элемента списка, перед которым срез должен закончиться. Сам элемент с индексом STOP не будет входить в выборку
  • STEP — шаг прироста выбираемых индексов

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

Например, срез [3:20:5] означает выборку значений с индексами 3, 8, 13 и 18.

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

  • Умолчательный START означает «от начала списка»
  • Умолчательный STOP означает «до конца списка включительно»
  • Умолчательный STEP означает «брать каждый элемент»

Вот несколько примеров с разными наборами параметров:

  • [:] или [::] — весь список
  • [::2] — нечетные по порядку элементы
  • [1::2] — четные по порядку элементы
  • [::-1] — все элементы в обратном порядке
  • [5:] — все элементы, начиная с шестого
  • [:5] — все элементы, не доходя до шестого
  • [-2:1:-1] — все элементы от предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг

Срезы могут работать в двух режимах: собственно выборка и присваивание.

Выборка элементов

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

'hello'[2:] # 'llo' (1, "foo", True, None)[2:] # (True, None) [1, 2, 3, 4, 5][2:] # [3, 4, 5] 

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

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

Присваивание срезу

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

l = [1, 2, 3, 4, 5, 6] l[::2] = [0, 0, 0] print(l) # => [0, 2, 0, 4, 0, 6] 

Если вы попробуете присвоить срезу с шагом неверное количество элементов, то получите ошибку:

l = [1, 2, 3, 4] l[::2] = [5, 6, 7] # Traceback (most recent call last): # File "", line 1, in # ValueError: attempt to assign sequence of size 3 to extended slice of size 2 

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

l = [1, 2, 3] l[2:] = [4, 5] print(l) # => [1, 2, 4, 5] l[1:-1] = [100] print(l) # => [1, 100, 5] l[:] = [] print(l) # => [] 

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

Срезы-значения

Хоть срезы и имеют специальную поддержку со стороны синтаксиса, но мы можем создавать и использовать срезы сами по себе — как обычные значения.

Значение среза можно сконструировать с помощью функции slice :

first_two = slice(2) each_odd = slice(None, None, 2) print(each_odd) # => slice(None, None, 2) l = [1, 2, 3, 4, 5] print(l[first_two]) # => [1, 2] print(l[each_odd]) # => [1, 3, 5] 

Функция slice принимает от одного до трех параметров — те самые START , STOP и STEP . При вызове функции с одним параметром, функция вызывается с параметром STOP .

Если вы хотите пропустить один из параметров, то подставьте вместо него None . Также None можно использовать и в записи срезов в квадратных скобках — там он так же будет означать пропуск значения.

На месте параметров среза могут быть любые выражения, лишь бы эти выражения вычислялись в целые числа или None .

Соотношение START и STOP

В срезе элемент с индексом STOP не попадает в выборку, в отличие от элемента с индексом START .

У такого поведения есть одна особенность. Какой бы неотрицательный индекс n мы ни выбрали, для любого списка будет соблюдаться указанное равенство:

l == l[:n] + l[n:] 

Посмотрим на такой пример:

s = 'Hello!' print(s[:2] + s[2:]) # => 'Hello!' print(s[:4] + s[4:]) # => 'Hello!' print(s[:0] + s[0:] == s) # => True print(s[:100] + s[100:] == s) # => True 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Что такое срезы и как их использовать в Python

Откройте для себя мощь срезов в Python, узнайте, как извлекать части строк, списков и кортежей, а также сделать ваш код лаконичным и читаемым.

Алексей Кодов
Автор статьи
10 июля 2023 в 17:48

Срезы (slices) — это удобный инструмент в Python для работы с итерируемыми объектами, такими как строки, списки и кортежи. Они позволяют легко извлекать часть объекта, не изменяя его исходное состояние. В этой статье мы рассмотрим основы работы с срезами и приведем примеры их использования.

Основы срезов

Срезы создаются с помощью квадратных скобок [] и двоеточия : . Синтаксис среза выглядит следующим образом:

iterable_object[start:stop:step]
  • start — индекс начала среза (включительно)
  • stop — индекс окончания среза (исключительно)
  • step — шаг (по умолчанию равен 1)

Важно отметить, что индексация в Python начинается с нуля.

Примеры использования срезов

Строки

Рассмотрим пример с использованием срезов для работы со строками:

text = "Python is fun!" # Извлечение подстроки с 0 по 6 индекс (не включая 6) substring = text[0:6] print(substring) # Вывод: Python

Списки

Срезы также применимы для работы со списками:

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Извлечение чисел от 3 до 7 (не включая 7) sublist = numbers[3:7] print(sublist) # Вывод: [3, 4, 5, 6]

Шаг среза

Параметр step позволяет извлекать элементы с определенным шагом:

# Извлечение каждого второго числа из списка even_numbers = numbers[0::2] print(even_numbers) # Вывод: [0, 2, 4, 6, 8]

Отрицательные индексы

Отрицательные индексы позволяют работать с итерируемыми объектами в обратном порядке:

# Извлечение последнего символа строки last_char = text[-1] print(last_char) # Вывод: !

Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Заключение

Теперь вы знакомы с основами работы с срезами в Python и можете использовать их для удобства при работе с итерируемыми объектами. Срезы являются мощным инструментом, который поможет сделать ваш код более лаконичным и читаемым. Удачи вам в изучении Python! ��

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

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