Индексы и срезы в Python
Строки и списки в Python состоят из элементов, занимающих свои нумерованные позиции в иерархии. К любому элементу, можно обратиться по его порядковому номеру — индексу. Отсчет начинается с нуля и ведется слева направо.
Индекс строки в Python
Строка представляет собой упорядоченный набор символов. Это значит, что каждый символ в строке занимает свое место — индекс. Например, у строки ‘string’, символ ‘s’ имеет индекс 0 и далее по порядку:
- s — 0
- t — 1
- r — 2
- i — 3
- n — 4
- g — 5
Первый по счету символ в строке всегда будет иметь индекс 0. Таким образом, обратившись по индексу к элементу, мы можем узнать его значение. В чем и состоит смысл индексов. У пробела, так же есть индекс.
get_str = 'это строка'
print(get_str)
это строка
А здесь, обратившись по индексу 5, получаем его значение — символ ‘t’.
get_s = 'это строка'
print(get_s[5])
t
При обращении к несуществующему индексу, программа выведет ошибку.
get_s = 'это строка'
print(get_s[10])
IndexError: string index out of range
Отрицательный индекс
Мы знаем точно, что у первого символа строки всегда будет индекс 0. А как насчет последнего символа? Ведь длина строки не всегда заранее известна. Для закрепления постоянного индекса для последнего символа, Python вводит понятие отрицательного индекса и предлагает вести отсчет наоборот, справа налево.
P y t h o n
-6 -5 -4 -3 -2 -1
get_last = 'Python'
print(get_last[-1])
n
Срез строки в Python
Иногда требуется получить из строки не один символ, а сразу несколько по некоторой закономерности — первые 2, каждый 3-ий или 4 последних. Для этого существуют срезы. Мы выборочно срезаем нужные символы и обращаемся по срезу. Надо отметить, что физически срезанные символы, остаются на своих местах. Сама строка никоим образом не меняется, мы работаем со срезанными копиями.
Возьмем первые три символа у строки ‘срезы Python’. В параметрах передадим два индекса — начало и конец среза. При срезе первый индекс входит включительно, а второй индекс не входит в выборку.
slice = 'срезы Python'
print(slice[0:3])
сре #символ 'з' не попал в выборку
Если не указаны начало или конец среза, то по умолчанию берётся первый или последний элемент коллекции.
slice = 'срезы Python'
print(slice[6:])
Python #с индекса 6 и до концаslice = 'срезы Python'
print(slice[:5])
срезы #с начала строки до 5-го индекса включительно
slice = 'срезы Python'
print(slice[:])
срезы Python #выводит строку целиком
Третьим параметром у срезов, может передаваться шаг.
slice = 'срезы Python'
print(slice[::2])
сеыPto #выводит символы через один
Индекс списка в Python
Список — это упорядоченная коллекция нумерованных элементов, где первый элемент начинается с нулевой позиции. Когда мы обратимся к 4-ому элементу, то получим 12.
a = [2, 3, 5, 9, 12, 16]
print(a[4])
12
Правила для индексов у списка, похожие для индексов у строк:
- обращение к несуществующему элементу, выведет ошибку
- первый индекс равен 0, а последний индекс -1
Заменить элемент в списке
Существует принципиальная разница — элементы в списках в отличие от элементов в строках можно заменять, удалять или добавлять. Мы обращаемся по индексу в 3-му элементу в списке d и присваиваем индексу новое значение. В результате произошла замена — 7 поменялась на 10.
d = [1, 3, 5, 7, 8]
d[3] = 10
print(d)
[1, 3, 5, 10, 8]
Удалить элемент из списка
Элемент со значением 15 под индексом 2, вылетел из списка.
f = [11, 13, 15, 17]
del f[2]
print(f)
[11, 13, 17]
Срез списка в Python
Со срезами у списков дело обстоит точно так же, как и у строк. Делаем выборку со 2-го индекса по 4-ый, не включая сам 4-ый индекс.
b = [21, 32, 54, 90, 22, 46]
print(b[2:4])
[54, 90]
Вывод четных элементов списка
Выведем все четные элементы списка, используя срезы. Первым параметром передаем 1-ый индекс, во втором параметре пишем двоеточие (по умолчанию выведется последний элемент списка) и третьим параметром указываем шаг для выводимых элементов.
c = [21, 22, 23, 24, 25, 26, 27]
print(c[1::2])
[22, 24, 26]
Итоги
Ранее мы научились создавать строку, узнали, какие у строк есть методы. Сегодня вы научились по индексам и срезам находить значения. Но на этом, познания о строках не заканчиваются и все самое интересное, вас ждет впереди.
- Создано 08.11.2019 10:03:33
- Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
myrusakov.ru
Индексы и срезы | Python 3 для начинающих и чайников
Сегодня мы поговорим об операциях взятия индекса и среза.
Взятие элемента по индексу
Как и в других языках программирования, взятие по индексу:
>>> a = [1, 3, 8, 7] >>> a[0] 1 >>> a[3] 7 >>> a[4] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
Как и во многих других языках, нумерация элементов начинается с нуля. При попытке доступа к несуществующему индексу возникает исключение IndexError.
В данном примере переменная a являлась списком, однако взять элемент по индексу можно и у других типов: строк, кортежей.
В Python также поддерживаются отрицательные индексы, при этом нумерация идёт с конца, например:
>>> a = [1, 3, 8, 7] >>> a[-1] 7 >>> a[-4] 1 >>> a[-5] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
Срезы
В Python, кроме индексов, существуют ещё и срезы.
item[START:STOP:STEP] — берёт срез от номера START, до STOP (не включая его), с шагом STEP. По умолчанию START = 0, STOP = длине объекта, STEP = 1. Соответственно, какие-нибудь (а возможно, и все) параметры могут быть опущены.
>>> a = [1, 3, 8, 7] >>> a[:] [1, 3, 8, 7] >>> a[1:] [3, 8, 7] >>> a[:3] [1, 3, 8] >>> a[::2] [1, 8]
Также все эти параметры могут быть и отрицательными:
>>> a = [1, 3, 8, 7] >>> a[::-1] [7, 8, 3, 1] >>> a[:-2] [1, 3] >>> a[-2::-1] [8, 3, 1] >>> a[1:4:-1] []
В последнем примере получился пустой список, так как START < STOP, а STEP отрицательный. То же самое произойдёт, если диапазон значений окажется за пределами объекта:
>>> a = [1, 3, 8, 7] >>> a[10:20] []
Также с помощью срезов можно не только извлекать элементы, но и добавлять и удалять элементы (разумеется, только для изменяемых последовательностей).
>>> a = [1, 3, 8, 7] >>> a[1:3] = [0, 0, 0] >>> a [1, 0, 0, 0, 7] >>> del a[:-3] >>> a [0, 0, 7]
Методы строк в Python
В Python у разных типов данных есть свои методы (функции), специфичные для этого типа данных. И раз уж на прошлом уроке мы начали знакомиться со строками, то никак не пройти и мимо методов строк.
Вызов метода в Python
Для вызова метода, прибавляем точку к переменной, для которой данный метод вызывается, пишем само название метода и передаем в скобочках аргументы.
переменная.метод(аргументы)
Поиск подстроки в строке Python
Для поиска подстроки в строке в Python, есть четыре метода:
- find()
- rfind()
- index()
- rindex()
Метод find() ищет индекс подстроки в строке — возвращает номер позиции символа указанного в аргументах.
>>> s='Найти подстроку'
>>> s.find('и')
4
В случае нескольких символов идущих подряд, Python вернет позицию, с которой начинается полное совпадение.
>>> s.find('под')
6
При обращении к несуществующей подстроке, вернется значение -1.
>>> s.find('ю')
-1
Метод index() тоже ищет подстроку в строке по её индексу, но в случае поиска несуществующей подстроки в отличии от find(), возвращает ошибку ValueError.
Методы rfind() и rindex() ищут подстроку с конца строки — справа.
>>> s.rfind('т')
10
Замена символа в строке
Метод replace() заменяет одни символы на другие, где первым параметром передаем, что заменить. А во втором параметре указываем , на что заменить.
>>> s.replace('ти','**')
'Най** подстроку'
Как удалить символ из строки?
Передадим во втором параметре пустые кавычки.
>>> s.replace('п','')
'Найти одстроку'
Как удалить пробелы в строке?
Первым параметром указываем пробел, а вторым параметром — пустые кавычки.
>>> s.replace(' ','')
'Найтиподстроку'
Разделить строку в Python
По умолчанию метод split() разделяет строку по пробелам и преобразует строку в список. В итоге мы получили список из трех элементов.
>>> h='разбить строку питон'
>>> h.split()
['разбить', 'строку', 'питон']
Разделить строку можно по любому другому символу, для этого передадим нужный символ в параметрах. При этом, сам символ удаляется из списка.
# Пример 1 - разделить по тире "-">>> p='питон-1 питон-2'
>>> p.split('-')
['питон', '1 питон', '2']
# Пример 2 - разделить по букве "t"
>>> c='method split in python'
>>> c.split('t')
['me', 'hod spli', ' in py', 'hon']
Объединить строки в Python
Несмотря на то, что метод join() является не строковым методом. Мы все равно его изучим в рамках данного урока. Поскольку join() в Python выполняет противоположную функцию метода split(). Берет элементы списка и преобразует список в строку. Имя переменной, ссылающейся на список строк — единственный передаваемый параметр метода join(). Перед точкой, мы указали разделитель — пустые кавычки.
>>> a=['1', '2', '3', '4', '5']
>>> ''.join(a)
'12345'# разделитель пробел
>>> ' '.join(a)
'1 2 3 4 5'
# разделитель запятая
>>> ','.join(a)
'1,2,3,4,5'
Метод join() не работает с числовыми данными. Следующая запись приведет к ошибке.
a=[6, 7, 8]
' '.join(a)
Перед использованием метода join(), следует числа привести к строкам.
>>> e=['9', '10']
>>> ' '.join(e)
'9 10'
Верхний регистр строки в Python
Метод upper() приводит все буквы строки к верхнему регистру, не меняя остальных символов.
>>> w='верхний регистр'
>>> w.upper()
'ВЕРХНИЙ РЕГИСТР'
Нижний регистр строки в Python
Метод lower() приводит все буквы строки к нижнему регистру.
>>> r='НИЖНИЙ РЕГИСТР'
>>> r.lower()
'нижний регистр'
Подсчет количества символов
Метод count() считает, сколько раз встречается подстрока в строке, указанная в параметрах.
>>> y="посчитать количество слов"
>>> y.count('о')
3
Проверка символов в строке
Метод isalpha() проверяет, состоит ли строка только из букв и возвращает истину или ложь.
>>> i='толькобуквы'
>>> i.isalpha()
True
Метод isdigit() проверяет, состоит ли строка только из цифр и возвращает истину или ложь.
>>> f='23456hbbn'
>>> f.isdigit()
False
- Создано 30.10.2019 10:53:26
- Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
myrusakov.ru
Основы Python — кратко. Строки. / Habr
Поскольку число положительных отзывов превысило число отрицательных, продолжу выкладывание уроков. Те кто уже знаком с основами — можете или просто пропустить урок, или попробовать сделать задание 3 самым коротким способом 🙂Для начала маленькое замечание.
Начиная с Python 2.3, всем, кто использует не-ASCII кодировку нужно добавлять указание о кодировке в самом начале программы. Для русского языка это будет в основном:
# -*- coding: cp1251 -*-
или использовать для хранения исходных текстов файлы utf-8 (что предпочтительней).
Изучив управление числами, пришла пора осваивать строки. Пайтон обладает весьма богатым набором возможностей в этой области.
Строки
Строки могут быть заключены в одинарные или двойные кавычки, строки могут использовать esc-последовательности в стиле С, многострочные константы задаются в тройных кавычках.
>>> "habrahabr" 'habrahabr' >>> 'foo bar boz' 'foo bar boz' >>> "won't" "won't" >>> 'don"t' 'don"t' >>> "couldn\"t" 'couldn"t' >>> """multi line ... very long ... string constant""" 'multi line\nvery long\nstring constant' >>> 'this takes \ ... two lines' 'this takes two lines'
Строки можно склеивать оператором + и «размножать» оператором *
>>> "Hello "+"word" 'Hello word' >>> "Hello "*3 'Hello Hello Hello '
По сути же своей строка представляет собой последовательность символов с произвольным доступом. Для получения части символов строки можно использовать т.н. оператор «среза». Обратите внимание, что нумерация начитается с нуля (и достаточно хаотична на первый взгляд).
>>> str = "Hello, cruel world!" # получить 4 символ строки >>> str[3] 'l' # все символы с 8 по 14 >>> str[7:14] 'cruel w' # каждый второй символ со 2 по 13 >>> str[1:12:2] 'el,cul' # некоторые значения можно опускать # каждый второй символ строки. >>> str[::2] 'Hlo re ol!'
Если опустить первый из трех параметров, он считается равным нулю, если опустить второй – срез будет продолжен до конца строки.
# первые 2 символа строки >>> str[:2] 'He' # вся строка кроме 2 первых символов >>> str[2:] 'llo, cruel world!'
Срезы с неправильными границами обрабатываются следующим образом:
— если верхняя граница среза больше длины строки, то она уменьшается до длины строки
— если нижняя граница больше верхней, то возвращается пустая строка
Также срезы могут принимать отрицательные значения.
# последний символ >>> str[-1] '!' # второй символ с конца >>> str[-2] 'd' # два последних символа >>> str[-2:] 'd!' # все символы кроме последних двух >>> str[:-2] 'Hello, cruel worl'
Лучший способ запомнить, как определяются индексы в срезе — считать их указывающими между символами, с номером 0 на левой границе первого символа. А правая граница последнего символа имеет индекс равный длине строки.
Для положительных символов длина строки равна разности между числами на границе.
Для определения длины строки используется функция len().
Unicode
В последних версиях Пайтон очень хорошо поддерживается работа с Unicode-строками.
Для задания unicode-строки в виде константы используется префикс u.
>>> uni = u"Тест" >>> uni u'\u0422\u0435\u0441\u0442'
Кроме того, Пайтон позволяет создать строку в Unicode с помощью одноименной функции.
>>> uni = unicode("Тест", "UTF-8") >>> uni u'\u0422\u0435\u0441\u0442'
Эта функция функция может работать с Latin-1, ASCII, UTF-8, UTF-16, с русскими кодировками ISO-8859-5, KOI8-R, CP1251, CP866 и Mac-cyrillic, и многими другими.
Для обратного преобразования служит метод encode, который преобразует unicode-строку в строку с заданной кодировкой.
>>> uni.encode("UTF-8") '\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82' >>> uni.encode("CP1251") '\xd2\xe5\xf1\xf2'
Для преобразования строки в список по определенному разделителю, используется метод split.
Этот метод в качестве параметра запрашивает разделитель, а возвращает список отдельных «слов» по которому можно «пройти» в цикле for.
>>> str = "Mary has a little lamb" >>> str.split(" ") ['Mary', 'has', 'a', 'little', 'lamb'] >>> for word in str.split(" "): ... print word ... Mary has a little lamb
Домашнее задание.
1. Написать программу, выводящую заданную пользователем строку как минимум в 3 разных кодировках. При этом писать вызов метода encode() в программе можно только 1 раз.
2. Написать программу поиска самого длинного слова в строке, разделенной пробелами.
3. (Повышенная сложность) Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена
— Каждая значащая цифра повторяется минимум 2 раза
— Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #
Например, входящая строка 4434###552222311333661 соответствует номеру 4452136
Кстати, регулярные выражения использовать в этих заданиях — нельзя 🙂
habr.com
индексирование, срезы, сортировка / Habr
Данная статья является продолжением моей статьи «Python: коллекции, часть 1: классификация, общие подходы и методы, конвертация».В данной статье мы продолжим изучать общие принципы работы со стандартными коллекциями (модуль collections в ней не рассматривается) Python.
Для кого: для изучающих Python и уже имеющих начальное представление о коллекциях и работе с ними, желающих систематизировать и углубить свои знания, сложить их в целостную картину.
ОГЛАВЛЕНИЕ:
- Индексирование
- Срезы
- Сортировка
1. Индексирование
1.1 Индексированные коллекции
Рассмотрим индексированные коллекции (их еще называют последовательности — sequences) — список (list), кортеж (tuple), строку (string).
Под индексированностью имеется ввиду, что элементы коллекции располагаются в определённом порядке, каждый элемент имеет свой индекс от 0 (то есть первый по счёту элемент имеет индекс не 1, а 0) до индекса на единицу меньшего длины коллекции (т.е. len(mycollection)-1).
1.2 Получение значения по индексу
Для всех индексированных коллекций можно получить значение элемента по его индексу в квадратных скобках. Причем, можно задавать отрицательный индекс, это значит, что будем находить элемент с конца считая обратном порядке.
При задании отрицательного индекса, последний элемент имеет индекс -1, предпоследний -2 и так далее до первого элемента индекс которого равен значению длины коллекции с отрицательным знаком, то есть (-len(mycollection).
элементы | a | b | c | d | e |
---|---|---|---|---|---|
индексы | 0 (-5) | 1 (-4) | 2 (-3) | 3 (-2) | 4 (-1) |
my_str = "abcde"
print(my_str[0]) # a - первый элемент
print(my_str[-1]) # e - последний элемент
print(my_str[len(my_str)-1]) # e - так тоже можно взять последний элемент
print(my_str[-2]) # d - предпоследний элемент
Наши коллекции могут иметь несколько уровней вложенности, как список списков в примере ниже. Для перехода на уровень глубже ставится вторая пара квадратных скобок и так далее.
my_2lvl_list = [[1, 2, 3], ['a', 'b', 'c']]
print(my_2lvl_list[0]) # [1, 2, 3] - первый элемент — первый вложенный список
print(my_2lvl_list[0][0]) # 1 — первый элемент первого вложенного списка
print(my_2lvl_list[1][-1]) # с — последний элемент второго вложенного списка
1.3 Изменение элемента списка по индексу
Поскольку кортежи и строки у нас неизменяемые коллекции, то по индексу мы можем только брать элементы, но не менять их:
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[0]) # 1
my_tuple[0] = 100 # TypeError: 'tuple' object does not support item assignment
А вот для списка, если взятие элемента по индексу располагается в левой части выражения, а далее идёт оператор присваивания =, то мы задаём новое значение элементу с этим индексом.
my_list = [1, 2, 3, [4, 5]]
my_list[0] = 10
my_list[-1][0] = 40
print(my_list) # [10, 2, 3, [40, 5]]
UPD: Примечание: Для такого присвоения, элемент уже должен существовать в списке, нельзя таким образом добавить элемент на несуществующий индекс.
my_list = [1, 2, 3, 4, 5]
my_list[5] = 6 # IndexError: list assignment index out of range
2 Срезы
2.1 Синтаксис среза
Очень часто, надо получить не один какой-то элемент, а некоторый их набор ограниченный определенными простыми правилами — например первые 5 или последние три, или каждый второй элемент — в таких задачах, вместо перебора в цикле намного удобнее использовать так называемый срез (slice, slicing).
Следует помнить, что взяв элемент по индексу или срезом (slice) мы не как не меняем исходную коллекцию, мы просто скопировали ее часть для дальнейшего использования (например добавления в другую коллекцию, вывода на печать, каких-то вычислений). Поскольку сама коллекция не меняется — это применимо как к изменяемым (список) так и к неизменяемым (строка, кортеж) последовательностям.
Синтаксис среза похож на таковой для индексации, но в квадратных скобках вместо одного значения указывается 2-3 через двоеточие:
my_collection[start:stop:step] # старт, стоп и шаг
Особенности среза:
Примеры срезов в виде таблицы:
Код примеров из таблицы
col = 'abcdefg'
print(col[:]) # abcdefg
print(col[::-1]) # gfedcba
print(col[::2]) # aceg
print(col[1::2]) # bdf
print(col[:1]) # a
print(col[-1:]) # g
print(col[3:4]) # d
print(col[-3:]) # efg
print(col[-3:1:-1]) # edc
print(col[2:5]) # cde
2.2. Именованные срезы
Чтобы избавится от «магических констант», особенно в случае, когда один и тот же срез надо применять многократно, можно задать константы с именованными срезами с пользованием специальной функции slice()()
Примечание: Nonе соответствует опущенному значению по-умолчанию. То есть [:2] становится slice(None, 2), а [1::2] становится slice(1, None, 2).
person = ('Alex', 'Smith', "May", 10, 1980)
NAME, BIRTHDAY = slice(None, 2), slice(2, None)
# задаем константам именованные срезы
# данные константы в квадратных скобках заменятся соответствующими срезами
print(person[NAME]) # ('Alex', 'Smith')
print(person[BIRTHDAY]) # ('May', 10, 1980)
my_list = [1, 2, 3, 4, 5, 6, 7]
EVEN = slice(1, None, 2)
print(my_list[EVEN]) # [2, 4, 6]
2.3 Изменение списка срезом
Важный момент, на котором не всегда заостряется внимание — с помощью среза можно не только получать копию коллекции, но в случае списка можно также менять значения элементов, удалять и добавлять новые.
Проиллюстрируем это на примерах ниже:
- Даже если хотим добавить один элемент, необходимо передавать итерируемый объект, иначе будет ошибка TypeError: can only assign an iterable
my_list = [1, 2, 3, 4, 5] # my_list[1:2] = 20 # TypeError: can only assign an iterable my_list[1:2] = [20] # Вот теперь все работает print(my_list) # [1, 20, 3, 4, 5]
- Для вставки одиночных элементов можно использовать срез, код примеров есть ниже, но делать так не рекомендую, так как такой синтаксис хуже читать. Лучше использовать методы списка .append() и .insert():Срез аналоги .append() и insert()
my_list = [1, 2, 3, 4, 5] my_list[5:] = [6] # вставляем в конец — лучше использовать .append(6) print(my_list) # [1, 2, 3, 4, 5, 6] my_list[0:0] = [0] # вставляем в начало — лучше использовать .insert(0, 0) print(my_list) # [0, 1, 2, 3, 4, 5, 6] my_list[3:3] = [25] # вставляем между элементами — лучше использовать .insert(3, 25) print(my_list) # [0, 1, 2, 25, 3, 4, 5, 6]
- Можно менять части последовательности — это применение выглядит наиболее интересным, так как решает задачу просто и наглядно.
my_list = [1, 2, 3, 4, 5] my_list[1:3] = [20, 30] print(my_list) # [1, 20, 30, 4, 5] my_list[1:3] = [0] # нет проблем заменить два элемента на один print(my_list) # [1, 0, 4, 5] my_list[2:] = [40, 50, 60] # или два элемента на три print(my_list) # [1, 0, 40, 50, 60]
- Можно просто удалить часть последовательности
my_list = [1, 2, 3, 4, 5] my_list[:2] = [] # или del my_list[:2] print(my_list) # [3, 4, 5]
2.4 Выход за границы индекса
Обращение по индексу по сути является частным случаем среза, когда мы обращаемся только к одному элементу, а не диапазону. Но есть очень важное отличие в обработке ситуации с отсутствующим элементом с искомым индексом.
Обращение к несуществующему индексу коллекции вызывает ошибку:
my_list = [1, 2, 3, 4, 5]
print(my_list[-10]) # IndexError: list index out of range
print(my_list[10]) # IndexError: list index out of range
А в случае выхода границ среза за границы коллекции никакой ошибки не происходит:
my_list = [1, 2, 3, 4, 5]
print(my_list[0:10]) # [1, 2, 3, 4, 5] — отработали в пределах коллекции
print(my_list[10:100]) # [] - таких элементов нет — вернули пустую коллекцию
print(my_list[10:11]) # [] - проверяем 1 отсутствующий элемент - пустая коллекция, без ошибки
Примечание: Для тех случаев, когда функционала срезов недостаточно и требуются более сложные выборки, можно воспользоваться синтаксисом выражений-генераторов, рассмотрению которых посвещена 4 статья цикла.
3 Сортировка элементов коллекции
Сортировка элементов коллекции важная и востребованная функция, постоянно встречающаяся в обычных задачах. Тут есть несколько особенностей, на которых не всегда заостряется внимание, но которые очень важны.
3.1 Функция sorted()
Мы может использовать функцию sorted() для вывода списка сортированных элементов любой коллекции для последующее обработки или вывода.
- функция не меняет исходную коллекцию, а возвращает новый список из ее элементов;
- не зависимо от типа исходной коллекции, вернётся список (list) ее элементов;
- поскольку она не меняет исходную коллекцию, ее можно применять к неизменяемым коллекциям;
- Поскольку при сортировке возвращаемых элементов нам не важно, был ли у элемента некий индекс в исходной коллекции, можно применять к неиндексированным коллекциям;
- Имеет дополнительные не обязательные аргументы:
reverse=True — сортировка в обратном порядке
key=funcname (начиная с Python 2.4) — сортировка с помощью специальной функции funcname, она может быть как стандартной функцией Python, так и специально написанной вами для данной задачи функцией и лямбдой.
my_list = [2, 5, 1, 7, 3]
my_list_sorted = sorted(my_list)
print(my_list_sorted) # [1, 2, 3, 5, 7]
my_set = {2, 5, 1, 7, 3}
my_set_sorted = sorted(my_set, reverse=True)
print(my_set_sorted) # [7, 5, 3, 2, 1]
Пример сортировки списка строк по длине len() каждого элемента:
my_files = ['somecat.jpg', 'pc.png', 'apple.bmp', 'mydog.gif']
my_files_sorted = sorted(my_files, key=len)
print(my_files_sorted) # ['pc.png', 'apple.bmp', 'mydog.gif', 'somecat.jpg']
3.2 Функция reversed()
Функция reversed() применяется для последовательностей и работает по другому:
- возвращает генератор списка, а не сам список;
- если нужно получить не генератор, а готовый список, результат можно обернуть в list() или же вместо reversed() воспользоваться срезом [: :-1];
- она не сортирует элементы, а возвращает их в обратном порядке, то есть читает с конца списка;
- из предыдущего пункта понятно, что если у нас коллекция неиндексированная — мы не можем вывести её элементы в обратном порядке и эта функция к таким коллекциям не применима — получим «TypeError: argument to reversed() must be a sequence»;
- не позволяет использовать дополнительные аргументы — будет ошибка «TypeError: reversed() does not take keyword arguments».
my_list = [2, 5, 1, 7, 3]
my_list_sorted = reversed(my_list)
print(my_list_sorted) # <listreverseiterator object at 0x7f8982121450>
print(list(my_list_sorted)) # [3, 7, 1, 5, 2]
print(my_list[::-1]) # [3, 7, 1, 5, 2] - тот же результат с помощью среза
3.3 Методы списка .sort() и .reverse()
У списка (и только у него) есть особые методы .sort() и .reverse() которые делают тоже самое, что соответствующие функции sorted() и reversed(), но при этом:
- Меняют сам исходный список, а не генерируют новый;
- Возвращают None, а не новый список;
- поддерживают те же дополнительные аргументы;
- в них не надо передавать сам список первым параметром, более того, если это сделать — будет ошибка — не верное количество аргументов.
my_list = [2, 5, 1, 7, 3]
my_list.sort()
print(my_list) # [1, 2, 3, 5, 7]
Обратите внимание: Частая ошибка начинающих, которая не является ошибкой для интерпретатора, но приводит не к тому результату, который хотят получить.
my_list = [2, 5, 1, 7, 3]
my_list = my_list.sort()
print(my_list) # None
3.4 Особенности сортировки словаря
В сортировке словаря есть свои особенности, вызванные тем, что элемент словаря — это пара ключ: значение.
UPD: Так же, не забываем, что говоря о сортировке словаря, мы имеем ввиду сортировку полученных из словаря данных для вывода или сохранения в индексированную коллекцию. Сохранить данные сортированными в самом стандартном словаре не получится, они в нем, как и других неиндексированных коллекциях находятся в произвольном порядке.
- sorted(my_dict) — когда мы передаем в функцию сортировки словарь без вызова его дополнительных методов — идёт перебор только ключей, сортированный список ключей нам и возвращается;
- sorted(my_dict.keys()) — тот же результат, что в предыдущем примере, но прописанный более явно;
- sorted(my_dict.items()) — возвращается сортированный список кортежей (ключ, значение), сортированных по ключу;
- sorted(my_dict.values()) — возвращается сортированный список значений
my_dict = {'a': 1, 'c': 3, 'e': 5, 'f': 6, 'b': 2, 'd': 4}
mysorted = sorted(my_dict)
print(mysorted) # ['a', 'b', 'c', 'd', 'e', 'f']
mysorted = sorted(my_dict.items())
print(mysorted) # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6)]
mysorted = sorted(my_dict.values())
print(mysorted) # [1, 2, 3, 4, 5, 6]
Отдельные сложности может вызвать сортировка словаря не по ключам, а по значениям, если нам не просто нужен список значений, и именно выводить пары в порядке сортировки по значению.
Для решения этой задачи можно в качестве специальной функции сортировки передавать lambda-функцию lambda x: x[1] которая из получаемых на каждом этапе кортежей (ключ, значение) будет брать для сортировки второй элемент кортежа.
population = {"Shanghai": 24256800, "Karachi": 23500000, "Beijing": 21516000, "Delhi": 16787941}
# отсортируем по возрастанию населения:
population_sorted = sorted(population.items(), key=lambda x: x[1])
print(population_sorted)
# [('Delhi', 16787941), ('Beijing', 21516000), ('Karachi', 23500000), ('Shanghai', 24256800)]
UPD от ShashkovS: 3.5 Дополнительная информация по использованию параметра key при сортировке
Допустим, у нас есть список кортежей названий деталей и их стоимостей.
Нам нужно отсортировать его сначала по названию деталей, а одинаковые детали по убыванию цены.
shop = [('каретка', 1200), ('шатун', 1000), ('седло', 300),
('педаль', 100), ('седло', 1500), ('рама', 12000),
('обод', 2000), ('шатун', 200), ('седло', 2700)]
def prepare_item(item):
return (item[0], -item[1])
shop.sort(key=prepare_item)
Результат сортировки
for det, price in shop:
print('{:<10} цена: {:>5}р.'.format(det, price))
# каретка цена: 1200р.
# обод цена: 2000р.
# педаль цена: 100р.
# рама цена: 12000р.
# седло цена: 2700р.
# седло цена: 1500р.
# седло цена: 300р.
# шатун цена: 1000р.
# шатун цена: 200р.
Перед тем, как сравнивать два элемента списка к ним применялась функция prepare_item, которая меняла знак у стоимости (функция применяется ровно по одному разу к каждому элементу. В результате при одинаковом первом значении сортировка по второму происходила в обратном порядке.
Чтобы не плодить утилитарные функции, вместо использования сторонней функции, того же эффекта можно добиться с использованием лямбда-функции.
# Данные скопировать из примера выше
shop.sort(key=lambda x: (x[0], -x[1]))
Дополнительные детали и примеры использования параметра key:
UPD от ShashkovS: 3.6 Устойчивость сортировки
Допустим данные нужно отсортировать сначала по столбцу А по возрастанию, затем по столбцу B по убыванию, и наконец по столбцу C снова по возрастанию.
Если данные в столбце B числовые, то при помощи подходящей функции в key можно поменять знак у элементов B, что приведёт к необходимому результату.
А если все данные текстовые? Тут есть такая возможность.
Дело в том, что сортировка sort в Python устойчивая (начиная с Python 2.2), то есть она не меняет порядок «одинаковых» элементов.
Поэтому можно просто отсортировать три раза по разным ключам:
data.sort(key=lambda x: x['C'])
data.sort(key=lambda x: x['B'], reverse=True)
data.sort(key=lambda x: x['А'])
Дополнительная информация по устойчивости сортировки и примеры: wiki.python.org/moin/HowTo/Sorting#Sort_Stability_and_Complex_Sorts (на наглийском).
Приглашаю к обсуждению:
- Если я где-то допустил неточность или не учёл что-то важное — пишите в комментариях, важные комментарии будут позже добавлены в статью с указанием вашего авторства.
- Если какие-то моменты не понятны и требуется уточнение — пишите ваши вопросы в комментариях — или я или другие читатели дадут ответ, а дельные вопросы с ответами будут позже добавлены в статью.
habr.com
Работа со строками в Python: литералы
Строки в Python — упорядоченные последовательности символов, используемые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме.
Это первая часть о работе со строками, а именно о литералах строк.
Литералы строк
Работа со строками в Python очень удобна. Существует несколько литералов строк, которые мы сейчас и рассмотрим.
Строки в апострофах и в кавычках
S = 'spam"s' S = "spam's"
Строки в апострофах и в кавычках — одно и то же. Причина наличия двух вариантов в том, чтобы позволить вставлять в литералы строк символы кавычек или апострофов, не используя экранирование.
Экранированные последовательности — служебные символы
Экранированные последовательности позволяют вставить символы, которые сложно ввести с клавиатуры.
Экранированная последовательность | Назначение |
---|---|
\n | Перевод строки |
\a | Звонок |
\b | Забой |
\f | Перевод страницы |
\r | Возврат каретки |
\t | Горизонтальная табуляция |
\v | Вертикальная табуляция |
\N{id} | Идентификатор ID базы данных Юникода |
\uhhhh | 16-битовый символ Юникода в 16-ричном представлении |
\Uhhhh… | 32-битовый символ Юникода в 32-ричном представлении |
\xhh | 16-ричное значение символа |
\ooo | 8-ричное значение символа |
\0 | Символ Null (не является признаком конца строки) |
«Сырые» строки — подавляют экранирование
Если перед открывающей кавычкой стоит символ ‘r’ (в любом регистре), то механизм экранирования отключается.
S = r'C:\newt.txt'
Но, несмотря на назначение, «сырая» строка не может заканчиваться символом обратного слэша. Пути решения:
S = r'\n\n\\'[:-1] S = r'\n\n' + '\\' S = '\\n\\n'
Строки в тройных апострофах или кавычках
Главное достоинство строк в тройных кавычках в том, что их можно использовать для записи многострочных блоков текста. Внутри такой строки возможно присутствие кавычек и апострофов, главное, чтобы не было трех кавычек подряд.
>>> c = '''это очень большая ... строка, многострочный ... блок текста''' >>> c 'это очень большая\nстрока, многострочный\nблок текста' >>> print(c) это очень большая строка, многострочный блок текста
Это все о литералах строк и работе с ними. О функциях и методах строк я расскажу в следующей статье.
Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>
pythonworld.ru
используемые методы, функции и операторы, примеры кода
От автора: в Python все является объектом, и строка тоже. Строка Python может быть создана просто с помощью заключения символов в двойные кавычки.
Например:
В этом руководстве мы узнаем:
Бесплатный курс «Python. Быстрый старт»
Получите курс и узнайте, как создать программу для перевода текстов на Python
Получить курсКак получать доступ к значениям в строках
О различных строковых операторах
Еще несколько примеров
О методе Python String replace()
Как приводить строки к верхнему и нижнему регистру
Об использование для строки функцию «join»
О реверсе строк
О разделении строк
Доступ к значениям в строках
Python не поддерживает тип символов, они обрабатываются как одна строка, а также рассматриваются как подстроки. Мы используем для разбивки квадратные скобки вместе с индексом или индексами, чтобы получить подстроки.
var1 = «Guru99!» var2 = «Software Testing» print («var1[0]:»,var1[0]) print («var2[1:5]:»,var2[1:5])
var1 = «Guru99!» var2 = «Software Testing» print («var1[0]:»,var1[0]) print («var2[1:5]:»,var2[1:5]) |
Различные строковые операторы
Существуют различные строковые операторы, которые можно использовать по-разному, например, объединять строки. Предположим, что если a=guru, а b=99, то a+b= «guru99″. Точно так же, если вы используете *2, это будет «GuruGuru». Также вы можете использовать другие операторы.
Оператор []. Описание: Фрагмент — дает символ с данным индексом. Пример: a[1] дает «u» из слова Guru, так как (0=G, 1=u, 2=r и 3=u).
Оператор [:]. Описание: Диапазон фрагментов — дает символы из заданного диапазона. Пример: x[1:3] даем «ur» из слова гуру Guru. Помните, что это не учитывать 0, который является G, это будет учитывать буквы после него.
Оператор in. Описание: Содержит — возвращает true, если в заданной строке есть буква. Пример: u присутствует в слове Guru и, следовательно, это даст 1 (true).
Оператор not in. Описание: Не содержит -возвращает true, если буква не существует в данной строке. Пример: l не присутствует в слове Guru и, следовательно, это даст 1.
x=»Guru» print «l» not in x
x=»Guru» print «l» not in x |
Оператор r/R. Описание: Необработанная строка подавляет фактическое значение escape-символов. Пример: Напечатайте r’\n’ печатает \n и напечатайте R’\n’ печатает \n.
Оператор % — используется для формата строк. Описание: %r — вставляет каноническое строковое представление объекта (т. е. repr(o)), %s — вставляет строковое представление объекта (т. е. str(o)), %d — форматирует число для отображения. Пример: Вывод этого кода будет «guru 99″.
name = ‘guru’ number = 99 print’%s %d’ % (name,number)
name = ‘guru’ number = 99 print’%s %d’ % (name,number) |
Оператор +. Описание: Объединение 2 строк. Пример: Объединяет строки и дает результат.
x=»Guru» y=»99″ print x+y
x=»Guru» y=»99″ print x+y |
Оператор *. Описание: Повторение. Пример: Выводит символ дважды.
x=»Guru» y=»99″ print x*2
x=»Guru» y=»99″ print x*2 |
Еще несколько примеров
Вы можете обновить строку Python, переназначив переменную другой строке. Новое значение может быть связано с предыдущим значением или с совершенно другой строкой.
x = «Hello World!» print(x[:6]) print(x[0:6] + «Guru99»)
x = «Hello World!» print(x[:6]) print(x[0:6] + «Guru99») |
Примечание: — Slice:6 или 0:6 дает тот же результат.
Метод строк Python replace()
Метод replace() возвращает копию строки, в которой значения старой строки были заменены новым значением.
oldstring = ‘I like Guru99’ newstring = oldstring.replace(‘like’, ‘love’) print(newstring)
oldstring = ‘I like Guru99’ newstring = oldstring.replace(‘like’, ‘love’) print(newstring) |
Бесплатный курс «Python. Быстрый старт»
Получите курс и узнайте, как создать программу для перевода текстов на Python
Получить курсИзменение верхнего и нижнего регистра строк
В Python вы можете даже привести строку к верхнему или нижнему регистру.
string=»python at guru99″ print(string.upper())
string=»python at guru99″ print(string.upper()) |
Кроме того, вы также можете использовать другую функцию, такую как capitalize:
string=»python at guru99″ print(string.capitalize())
string=»python at guru99″ print(string.capitalize()) |
Вы также можете преобразовать строку в нижний регистр:
string=»PYTHON AT GURU99″ print(string.lower())
string=»PYTHON AT GURU99″ print(string.lower()) |
Использование для строки функции «join»
Функция join является более гибким способом объединения строк. С помощью функции join вы можете добавить в строку любой символ.
Например, если вы хотите добавить двоеточие (:) после каждого символа в строке «Python», вы можете использовать следующий код.
print(«:».join(«Python»))
print(«:».join(«Python»)) |
Реверс строк
Используя функцию реверса, вы можете перевернуть строку. Например, если у нас есть строка «12345», а затем, если вы применяете код для обратной функции, как показано ниже.
string=»12345″ print(».join(reversed(string)))
string=»12345″ print(».join(reversed(string))) |
Разделение строк
Разделение строк — это еще одна функция, которая может применяться в Python, давайте посмотрим на строку «guru99 career guru99″. Сначала мы разделим строку с помощью команды word.split и получим результат.
word=»guru99 career guru99″ print(word.split(‘ ‘))
word=»guru99 career guru99″ print(word.split(‘ ‘)) |
Чтобы лучше это понять, мы рассмотрим еще один пример разделения, вместо пробела (») мы используем (‘r’), и это будет разбивать строку везде, где в строке встречается ‘r’:
word=»guru99 career guru99″ print(word.split(‘r’))
word=»guru99 career guru99″ print(word.split(‘r’)) |
Важное примечание: В Python строки являются неизменяемыми. Рассмотрим следующий код:
x = «Guru99″ x.replace(«Guru99″,»Python») print(x)
x = «Guru99» x.replace(«Guru99″,»Python») print(x) |
все равно возвращает Guru99. Это связано с тем, что x.replace («Guru99″, «Python») возвращает копию X с выполненными заменами. Вам нужно будет использовать следующий код, чтобы увидеть изменения:
x = «Guru99″ x = x.replace(«Guru99″,»Python») print(x)
x = «Guru99» x = x.replace(«Guru99″,»Python») print(x) |
Приведенные выше коды являются примерами Python 3. Если вы хотите запустить Python 2, рассмотрите следующий код.
#Accessing Values in Strings var1 = «Guru99!» var2 = «Software Testing» print «var1[0]:»,var1[0] print «var2[1:5]:»,var2[1:5] #Some more examples x = «Hello World!» print x[:6] print x[0:6] + «Guru99″ #Python String replace() Method oldstring = ‘I like Guru99’ newstring = oldstring.replace(‘like’, ‘love’) print newstring #Changing upper and lower case strings string=»python at guru99″ print string.upper() string=»python at guru99″ print string.capitalize() string=»PYTHON AT GURU99″ print string.lower() #Using «join» function for the string print»:».join(«Python») #Reversing String string=»12345″ print».join(reversed(string)) #Split Strings word=»guru99 career guru99″ print word.split(‘ ‘) word=»guru99 career guru99″ print word.split(‘r’) x = «Guru99″ x.replace(«Guru99″,»Python») print x x = «Guru99″ x = x.replace(«Guru99″,»Python») print x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #Accessing Values in Strings var1 = «Guru99!» var2 = «Software Testing» print «var1[0]:»,var1[0] print «var2[1:5]:»,var2[1:5] #Some more examples x = «Hello World!» print x[:6] print x[0:6] + «Guru99» #Python String replace() Method oldstring = ‘I like Guru99’ newstring = oldstring.replace(‘like’, ‘love’) print newstring #Changing upper and lower case strings string=»python at guru99″ print string.upper() string=»python at guru99″ print string.capitalize() string=»PYTHON AT GURU99″ print string.lower() #Using «join» function for the string print»:».join(«Python») #Reversing String string=»12345″ print».join(reversed(string)) #Split Strings word=»guru99 career guru99″ print word.split(‘ ‘) word=»guru99 career guru99″ print word.split(‘r’) x = «Guru99» x.replace(«Guru99″,»Python») print x x = «Guru99» x = x.replace(«Guru99″,»Python») print x |
В Python появилась функция .format, которая позволяет использовать %d и т. д. для форматирования строк.
Заключение
Поскольку Python является объектно-ориентированным языком программирования, многие функции могут быть применены к объектам Python. Примечательной особенностью Python являются отступы исходных операторов, облегчающие чтение кода.
Доступ к значениям через разделение — квадратные скобки используются для нарезки вместе с индексом или индексами для получения подстроки.
В нарезке, если диапазон объявлен [1: 5], он может фактически извлечь значение из диапазона [1: 4]
Вы можете обновить строку Python, переназначив переменную другой строке
Метод replace() возвращает копию строки, в которой вхождение старых символов заменяется новыми.
Синтаксис для метода replace: oldstring.replace(«значение, на которое заменяем», «значение, которое заменяем»)
Строковые операторы, такие как [], [:], in, Not in и т. д., могут применяться для конкатенации строки, извлечения или вставки определенных символов в строку или для проверки того, существует ли определенный символ в строке
Другие строковые операции включают:
Изменение верхнего и нижнего регистра
Функция Join, чтобы добавить любой символ в строку
Реверс строк
Разделение строк
Источник: https://www.guru99.com
Редакция: Команда webformyself.
Бесплатный курс «Python. Быстрый старт»
Получите курс и узнайте, как создать программу для перевода текстов на Python
Получить курсwebformyself.com