Python кортеж
Чтобы усовершенствовать программный код, добавить в него новые важные функции используются разнообразные методы. К ним относится: создание списков, кортежей или словарей. В данной статье рассмотрим, когда используются, чем они отличаются, как создать и как работать с кортежами в Python 3.
Что такое кортеж
Кортеж – это неизменная структура заданных заранее значений. Он очень похож на список, но последний подвержен изменениям. Так, если нужно исправить какой-то элемент списка, можно сделать это, напрямую указав:
Если же записать подобный код, но попытаться применить его к кортежу, ничего не выйдет, а на экране появится надпись об ошибке. Считается, что это важно, поскольку таким образом данные невозможно будет изменить как случайно, так и намеренно. Также в python добавление элемента в кортеж невозможно. Правда можно привести его в список, добавить элемент. После этого полученный список преобразовать обратно.
Выгодное преимущество кортежа состоит также в том, что он имеет меньший размер, что проверяется применением команды sizeof. Она показывает, сколько занимает объект в байтах:
Из этого кода видно, что кортеж (в круглых скобках) занимает 36 байтов, а список (в квадратных скобках) – 44 байта.
Создание
Кортеж определяется точно так же, как и список, однако перечисление происходит в круглых, а не квадратных скобках. Элементы будут стоять в определенном порядке, а их нумерация всегда начинается с нуля. А точнее для непустого кортежа первым элементом будет являться ноль. Отрицательный индекс позволит отсчитывать все с конца (с правой стороны).
Приведем пример создания в Python обычного кортежа:
Можно преобразовать список в кортеж следующим образом:
Рассмотрим кортеж с отрицательным индексом:
То есть на экране отобразился первый не с начала, а с конца элемент.
Чтобы создать кортеж с одним элементом, нужно сделать такую запись:
Нужно обратить особое внимание на то, что даже если элемент один, после него все равно должна стоять запятая.
Иногда для создания кортежей используются генераторы. Обычно они служат, чтобы компактно и удобно создать необходимую коллекцию элементов. Приведем пример:
Выше представлен генератор кортежа. То есть мы создали генератор. После этого преобразовали его к кортежу с помощью ключевого слова tuple.
Подробнее о срезах описано ниже в пункте «Обращение к элементу».
Использование генераторов кортежей аналогично генераторам списка.
Обращение к элементу
У каждого элемента есть свой индекс. То есть, в Python для обращения к элементу кортежа, нужно просто указать его индекс. Напомним, что счет начинается с нуля. Посмотрим на код:
Из кортежа можно извлечь как элемент, так и срез. В этом случае мы получим кортеж, состоящий из элементов, расположенных в промежутке среза. Следует уточнить, что при указании среза используются не номера элементов, а номера промежутков между ними. Перед первым элементом находится промежуток с индексом 0. Рассмотрим пример:
Методы
Кортежи в python имеют только два метода: index() и count(). Первый применяется, чтобы узнать, какой индекс у определенного элемента. Например:
Элементов «33» в кортеже несколько, но на экран будет выведен индекс первого из них.
Метод count используется, если нужно узнать, сколько определенных элементов имеется в кортеже.
На экране перед пользователем появится именно число 3, потому что в кортеже искомое число 33 повторяется 3 раза.
Помните, что в кортежах нет методов добавления и удаления элементов.
Именованные кортежи
Данный класс не получил широкого применения среди программистов, хотя он и является достаточно важным и полезным. Именованные кортежи в python (или namedtuple) в каком-то смысле являются расширениями для обычных. Так, огромной проблемой считается то, что получать данные из кортежа можно только при помощи числовых индексов. А что делать, если хочется для наглядности кода обращаться к элементам, используя строковое наименование. Такое обращение значительно улучшит читаемость кода. Для этого на помощь приходит namedtuple.
Для того, чтобы использовать namedtuple, необходимо подключить библиотеку collections. Это делается с помощью import collecions * . В этом случае обращаться к namedtuple будет необходимо следующим образом: collections.namedtuple( [параметры] ) . Другой вариант подключения библиотеки приведен в примере ниже.
Каждый элемент, сохраненный в именованном кортеже, доступен через определенный идентификатор. Посмотрим на примере кода:
Наименования полей были перечислены через пробел. Вместо этой строки можно было передать список со строками. В конструкторе namedtuple разобьет полученную строку с помощью split. В качестве примера было приведено обращение к элементу cost. К остальным обращение аналогично: rose.color , rose.comment .
Таким образом, именованный кортеж делает вид программного кода более читаемым. Так, в вышеуказанном коде можно увидеть наименования color, cost и comment. И при всем при этом, сохраняется возможность обращения к элементам по индексу, например дописав к предыдущему коду:
Список кортежей
Иногда бывают задачи, в которых нужно хранить таблицы с данными, которые называются матрицами (или двумерными массивами). Для работы с массивами используется библиотека array. К сожалению, не получится с ее помощью сделать массив кортежей. Потому что элементом массива не может быть кортеж.
Из этой ситуации есть выход — создание в Python списка кортежей. Вариант объявления такого списка представлен ниже:
Cортировка
Иногда нужно отсортировать имеющиеся элементы списка. Благодаря встроенной функции sorted, все это делается достаточно легко:
Видно, что произошла сортировка кортежа Python по алфавиту. Стандартную сортировку можно провести и по числовым элементом. Посмотрим на пример:
Заметим, что произошла сортировка по возрастанию.
В список
Кортеж можно переделать в список:
Таким образом, кортеж был преобразован в список Python, который можно изменить. Теперь рассмотрим обратное действие — преобразование списка в кортеж:
В словарь
Словарь – это еще одна структура используемая в Python. Он, как и список, является изменяемым, но при этом неупорядоченным. Это значит, что обратиться к определенному элементу посредством указания индекса – не получится. Чтобы лучше понять, можно провести аналогию с обычным англо-русским словарем. В нем для каждого слова есть перевод: house –дом, flat – квартира, window – окно. Если перенести такую структуру в программный код, то получится такая запись, оформляемая фигурными скобками:
Последовательность пар при выводе на экран не определяется никаким правилом, отображаются они в произвольном порядке.
Для того, чтобы в Python преобразовать кортеж в словарь, необходимо использовать приведение типов с помощью dict.
Как видно, для создания словаря понадобился кортеж кортежей. Причем вложенные кортежи состоят из двух элементов каждый. Иначе не получается провести преобразование к словарю.
В строку
Чтобы вывести в python кортеж в одну строку, используется функция join. Посмотрим на примере:
После выполнения кода на дисплее появится запись всех элементов в одну строку с указанным разделителем. В первом случае — без пробелов, а во втором случае — через запятую.
Чем же кортежи удобнее? Работа с ними проходит быстрее, чем, например, со списками. Если программисту нужно определить постоянный набор значений, чтобы затем их перебирать, то лучше будет сделать это с его помощью. Плюс – это экономия оперативной памяти, так как они занимают меньше места, чем списки.
Самоучитель
Предположим, что вы составляете список гостей на свадьбу. Этот список постоянно меняется: добавились друзья семьи Дима и Света, не смогут прийти троюродные сестры со стороны жены Лида с Наташей.
Для представления таких данных из реального мира в Python отлично подходят списки. Списки — это еще один встроенный тип данных Python.
Создать, или другими словами, объявить список в Python можно двумя способами, так:
Вернемся, однако, к гостям на свадьбе. Для создания списка гостей, сразу же при создании помещаем внутрь скобок строки с именами через запятую.
Операции с элементами списка
В нашем списке три элемента: «Родители», «Одноклассники», «Лида и Наташа», — которые хранятся внутри списка именно в таком порядке. Если только вы не измените порядок списка, «Родители» всегда будет первым элементом, «Одноклассники» — вторым и «Лида и Наташа» — третьим. Родители представляет собой начало списка, а Лида и Наташа — конец. Мы помним, что Лида и Наташа не смогут прийти, и их нужно удалить из списка.
С помощью метода remove можно удалить последний элемент в списке.
Но не забываем, нужно еще добавить в список двух гостей. Добавление новых элементов в конец списка происходит при помощи метода append.
В список можно не только добавить элемент, но и изменить одно из его значений на другое, согласно индексу элемента.
И так, список — это контейнер, хранящий объекты в определенном порядке. Обратите внимание, что в отличие от строк, методы списка меняют исходный список. Есть однако у списков кое‑что общее со строками. Это доступ к элементу по индексу и срезы. Все это работает в списках точно так же, как и в строках.
Кортежи
Кортежи — это контейнеры, хранящие объекты в определенном порядке. В отличие от списков, кортежи неизменяемы.
Как только вы создали кортеж, значение какого‑либо его элемента уже нельзя изменить, как нельзя добавлять и удалять элементы. Кортежи объявляются с помощью круглых скобок. Элементы в кортеже должны быть разделены запятыми.
Для создания кортежей также используют один из двух вариантов синтаксиса. Первый:
Чтобы добавить в кортеж новые объекты, создайте его вторым способом, указав через запятую каждый желаемый элемент.
Даже если кортеж содержит только один элемент, после этого элемента все равно нужно поставить запятую. Таким образом Python отличает кортеж от числа в скобках, определяющих порядок выполнения операций.
Получить элементы кортежа можно так же, как и элементы списка, указывая индекс элемента.
Ключевое слово in / not in
Проверить, содержится ли элемент в кортеже, можно с помощью ключевого слова in.
Поместите перед in ключевое слово not для проверки отсутствия элемента в кортеже.
Те же операции с ключевыми словами in и not in сработают и со списками.
Сложение кортежей и списков
При помощи оператора сложения можно соединять друг с другом две одинаковые структуры данных. Пример ниже со списками также будет работать и с кортежами:
На данном этапе вам может стать интересно, зачем использовать структуры данных, которые кажутся менее гибкими, чем списки? На самом же деле, кортежи удобны, когда вы имеете дело со значениями, которые никогда не изменятся. Примером таких данных для кортежа могут быть географические координаты. Долготу и широту города следует сохранить в кортеже, поскольку эти значения никогда не изменятся, а сохранение в кортеже будет гарантировать, что другие части программы случайно их не изменят.
Итерирование
Строки, списки и кортежи поддерживают итерирование (программа может их перебирать, значение за значением), то есть к каждому их элементу можно получить доступ через цикл — такие объекты называются итерируемыми. Каждый элемент в итерируемом объекте, как мы уже знаем, имеет свой порядковый индекс.
В следующем примере элемент Москва записан в списке с индексом 0, Хельсинки с индексом 1, а ‘Анкара’ с индексом 2.
Вот мы и познакомились с оператором for — циклом, перебирающим итерируемый объект. Цикл for можно использовать, чтобы определять инструкции, которые будут выполняться один раз для каждого элемента в итерируемом объекте, и с помощью таких инструкций вы можете получать доступ ко всем этим элементам и осуществлять операции с ними.
Например, с помощью цикла for, выполняющего перебор списка строк, и метода upper() можно сделать символы каждой строки прописными:
Как показано в примерах выше, цикл for определяется синтаксисом: for имя_переменной in имя_итерируемого_объекта: где *имя_переменной – выбранное вами имя переменной, в которую каждую итерацию цикла будет записываться очередное значение из итерируемого объекта.
Основы работы со списками и кортежами¶
Список — упорядоченная изменяемая последовательность объектов произвольного типа. В языке Python списки представлены типом list .
Кортеж — неизменяемый аналог списков, которому соответствует тип данных tuple .
Изменяемая последовательность — последвательность, в которой после ее создания возможно изменение количества элементов или присваивание им объектов.
Создание списков и кортежей¶
Используя конструкторы list() и tuple() , можно выполнять преобразование последовательностей в список либо кортеж.
Операции со списками и кортежами¶
Списки и кортежи поддерживают общий для последовательностей набор операций. В примерах будет использован список:
Проверка на принадлежность элемента x последовательности s :
Наименьший элемент последовательности:
Наибольший элемент последовательности:
Методы списков и кортежей¶
Подобно строкам, списки и кортежи поддерживают различные методы. Ниже будут приведены методы списков. Для кортежей реализованы только операции, которые не меняют исходный объект.
Вставка элемента в конец списка:
Добавление элементов списка L в конец списка:
Вставка элемента x по индексу i:
Удаление первого вхождения x из списка:
Извлечение элемента из списка:
Удаление всех элементов из списка:
Изменение порядка элементов на обратный:
Поиск индекса первого вхождения элемента:
Задачи¶
Пользователь вводит числа a и b . Создать список, содержащий квадраты целых чисел расположенных между ними.
Пользователь вводит числа до тех пор, пока не введет слово end . Поместите введенные числа в список. Выведите на экран только нечетные элементы списка.
Пользователь вводит числа до тех пор, пока не введет слово ‘end’. Поместите введенные числа в список. Подсчитайте количество четных и нечетных элементов в списке.
Дан список чисел. Выведите все элементы списка, которые больше предыдущего элемента.
Дан список чисел. Поменяйте местами минимальный и максимальный элемент этого списка.
Дан список чисел. Определите, сколько в нем различных элементов.
Петя перешёл в другую школу. На уроке физкультуры ему понадобилось определить своё место в строю. Помогите ему это сделать. Программа получает на вход последовательность чисел, означающих рост каждого человека в строю. После этого вводится число X – рост Пети. Все числа во входных данных натуральные и не превышают 200. Выведите номер, под которым Петя должен встать в строй. Если в строю есть люди с одинаковым ростом, таким же, как у Пети, то он должен встать после них.
Дан список чисел. Циклически сдвиньте элементы списка вправо (A[0] переходит на место A[1], A[1] на место A[2], …, последний элемент переходит на место A[0]).