Списки и кортежи
Списки и кортежи упорядоченными коллекциями, которые могут хранить элементы различных типов данных. Их ключевое различие заключается в изменяемости: списки являются изменяемыми объектами, в то время как кортежи – неизменяемыми. Это означает, что после создания кортежа вы не можете добавлять, удалять или изменять его элементы, в отличие от списков, которые поддерживают эти операции.
Списки, благодаря своей гибкости, являются одним из наиболее часто используемых типов данных в Python. Кортежи же идеально подходят для хранения набора фиксированных значений, обеспечивая целостность данных, занимая (в некоторых случаях) меньше памяти и демонстрируя более высокую производительность при переборе элементов.
Выбор между списком и кортежем обычно диктуется требованиями конкретной задачи, в частности необходимостью изменения хранимых данных.
Создание списка
Существует несколько способов создания списков в Python.
1. Список создаёт перечисление элементов через запятую внутри квадратных скобок []
:
emperors = ["Александр I", "Пётр I", "Павел I"]
При этом списки могут быть вложенными, то есть содержать другие списки в качестве своих элементов:
emperors = ["Александр I", "Пётр I", "Павел I", ["Николай I", "Николай II"]]
2. В список можно преобразовать другую коллекцию с помощью функции list()
.
Функция | list(iterable) |
Описание | Создаёт список из всех объектов коллекции iterable |
Параметры | iterable – коллекция для преобразования в список |
Возвращаемое значение | Список |
Список, созданный из строки, будет состоять из символов, из которых она состоит:
famous_poem = "Одиссея"
print(list(famous_poem))
# Вывод: ['О', 'д', 'и', 'с', 'с', 'е', 'я']
Списки, созданные из кортежа и множества, сохранят свои элементы:
famous_places = ("Эрмитаж", "Петропавловская крепость", "Летний сад")
print(list(famous_places))
# Вывод: ['Эрмитаж', 'Петропавловская крепость', 'Летний сад']
famous_sculptures = {"Венера Милосская", "статуя Давида"}
print(list(famous_sculptures))
# Вывод: ['статуя Давида', 'Венера Милосская']
Но при преобразовании множества порядок элементов в полученном списке непредсказуемым, так как множества сами по себе являются неупорядоченными коллекциями.
При создании списка из словаря по умолчанию используются его ключи:
famous_arts = {"Мона Лиза": 1506, "Рождение Венеры": 1486}
print(list(famous_arts))
# Вывод: ["Мона Лиза", "Рождение Венеры"]
Для создания списка из значений словаря необходимо использовать метод dict.values()
:
print(list(famous_arts.values()))
# Вывод: [1506, 1486]
Создание пустого списка
Функция list()
без аргументов или пустые квадратные скобки []
создают пустой список:
emperors_achievements = list()
emperors_achievements = []
Создание кортежа
Кортежи также можно создавать несколькими способами:
1. Кортеж создаёт перечисление элементов через запятую внутри круглых скобок ()
или без круглых скобок:
empress1 = ("Мария Испанская", "Констанция Сицилийская", "Елизавета Померанская")
empress2 = "Анна I Иоанновна", "Мария Терезия"
Здесь в обоих случаях создаются кортежи, так как кортеж создаёт именно запятая, а не скобки. Поэтому при создании кортежа из одного элемента, после него нужно обязательно ставить запятую:
princess = ("Анна Византийская",)
Без запятой Python интерпретирует выражение как обычное значение того же типа:
princess = ("Анна Византийская")
print(type(princess))
# Вывод: <class "str">
Без запятой строка в скобках является просто строкой, а не кортежем. Этим мы уже пользовались для разбиения длинных строк на части.
2. В кортеж можно преобразовать другую коллекцию с помощью функции tuple()
.
Функция | tuple() |
Описание | Создаёт кортеж из всех объектов коллекции iterable |
Параметры | iterable – коллекция для преобразования в список |
Возвращаемое значение | Кортеж |
Тогда из строк будет создан кортеж, состоящий из символов, а из списков, множеств и других последовательностей – из элементов:
house = "Палеологи"
print(tuple(house))
# Вывод: ("П", "а", "л", "е", "о", "л", "о", "г", "и")
children = ["Анна Палеологина", "Мануил Палеолог"]
print(tuple(children))
# Вывод: ("Анна Палеологина", "Мануил Палеолог")
languages = {"Греческий язык", "Латинский язык", "Итальяеский язык"}
print(tuple(languages))
# Вывод: ("Греческий язык", "Итальяеский язык", "Латинский язык")
Множественное присваивание
Также мы уже создавали кортежи, когда рассматривали операцию множественного присваивания:
year, age = 1234, 16
На самом деле здесь справа создаётся кортеж (1234, 16)
, который затем распаковывается в переменные year
и age
.
Создание пустого кортежа
Пустой кортеж можно создать только с помощью функции tuple()
без аргументов:
emperors = ["Александр I", "Пётр I", "Павел I"]
achievements = list()
achievements = []
empress1 = ("Мария Испанская", "Констанция Сицилийская", "Елизавета Померанская")
empress2 = "Анна I Иоанновна", "Мария Терезия"
achievements = tuple()
(,)
не создаст пустой кортеж, а только приведёт к синтаксической ошибке.
Сложение и умножение списков и кортежей
Списки и кортежи поддерживают операции сложения (конкатенации) и умножения (повторения), аналогичные строкам.
Сложение списков и кортежей
Конкатенация списков или кортежей создаёт новый список или кортеж, состоящий из всех элементов первой и второй коллекции:
female_dragons = ["Арракс", "Вермакс", "Вермитор"]
male_dragons = ["Тессарион", "Среброкрылая"]
dragons = female_dragons + male_dragons
print(dragons)
# Вывод: ["Арракс", "Вермакс", "Вермитор", "Тессарион", "Среброкрылая"]
infantry = ("Стрельцы", "Копейщики", "Гренадеры")
cavalry = ("Рыцари", "Гусары")
warriors = infantry + cavalry
print(warriors)
# Вывод: ("Стрельцы", "Копейщики", "Гренадеры", "Рыцари", "Гусары")
Также допускается использование расширенного оператора сложения с присваиванием +=
, который добавляет элементы второй коллекции в конец первой:
female_dragons += male_dragons
print(female_dragons)
# Вывод: ["Арракс", "Вермакс", "Вермитор", "Тессарион", "Среброкрылая"]
infantry += cavalry
print(infantry)
# Вывод: ("Стрельцы", "Копейщики", "Гренадеры", "Рыцари", "Гусары")
Для списков происходит изменение первого списка, а для кортежей создается новый объект.
Умножение списков и кортежей
Умножение списка или кортежа на целое число n
создаёт новую коллекцию, в которой исходная последовательность повторяется n
раз:
battle_cries = ["За родину!", "За Сталина!"]
more_battle_cries = battle_cries * 3
print(more_battle_cries)
# Вывод: ["За родину!", "За Сталина!", "За родину!", "За Сталина!", "За родину!", "За Сталина!"]
polite_phrases = ("Хорошего дня!", "Хороших выходных!")
more_polite_phrases = polite_phrases * 3
print(more_polite_phrases)
# Вывод: ("Хорошего дня!", "Хороших выходных!", "Хорошего дня!", "Хороших выходных!", "Хорошего дня!", "Хороших выходных!")
Если не нужно сохранять исходную коллекцию, то умножение списка или кортежа на число также поддерживает оператор умножения с присваиванием *=
:
battle_cries *= 3
print(battle_cries)
# Вывод: ["За родину!", "За Сталина!", "За родину!", "За Сталина!", "За родину!", "За Сталина!"]
polite_phrases *= 3
print(polite_phrases)
# Вывод: ("Хорошего дня!", "Хороших выходных!", "Хорошего дня!", "Хороших выходных!", "Хорошего дня!", "Хороших выходных!")
Поиск элементов в списках и кортежах
Как и для строк, для поиска индекса первого вхождения искомого элемента в коллекцию используется метод index()
.
Методы | list.index(item, start=0, end=None) tuple.index(item, start=0, end=None) |
Описание | Возвращает начальный индекс первого вхождения элемента item в список list или кортеж tuple |
Параметры | item – искомый элементНеобязательные параметры: start – индекс начала среза, в котором ищется элемент, по умолчанию start=0 end – индекс конца среза, в котором ищется элемент, по умолчанию end=None |
Возвращаемое значение | Целое число |
Если не указаны параметры среза [start:end]
, то поиск ведётся во всей коллекции:
grades = [4, 4, 5, 5, 4, 5]
print(grades.index(4))
# Вывод: 0
Но также мы можем ограничить область поиска:
schedule = ("Русский язык", "Математика", "Математика", "Информатика", "Технология")
print(schedule.index("Математика", 2, 4))
# Вывод: 2
Здесь первый найденный элемент имеет индекс 2
, так как такой же элемент с индексом 1
исключен из поиска с помощью среза.
Как и в случае строк, если искомый элемент отсутствует в коллекции, метод вызывает исключение ValueError:
schedule = ["Русский язык", "Математика", "Математика", "Информатика", "Технология"]
print(schedule.index("Литература"))
# Ошибка: ValueError: tuple.index(x): x not in list
Подсчёт количества вхождений элемента в список или кортеж
Подсчёта количества вхождений элемента в список или кортеж позволяет осуществить метод count()
, который также совпадает с аналогичным методом для строк.
Метод | list.count(item, start=0, end=None) tuple.count(item, start=0, end=None) |
Описание | Возвращает количество вхождений элемента item в список list или кортеж tuple |
Параметры | item – подсчитываемый элементНеобязательные параметры: start – индекс начала среза, в котором ищется элемент, по умолчанию start=0 end – индекс конца среза, в котором ищется элемент, по умолчанию end=None |
Возвращаемое значение | Целое число |
Как и в случае использования метода index()
мы можем производить подсчёт элемента во всей коллекции или ограничить область подсчёта с помощью параметров среза start
и end
:
breakfast = ["Чай", "Печенье", "Печенье", "Печенье", "Варенье"]
print(breakfast.count("Печенье"))
# Вывод: 3
spoons = ("Столовая ложка", "Чайная ложка", "Столовая ложка", "Чайная ложка")
print(spoons.count("Чайная ложка"))
# Вывод: 2
1. В чем заключается основное различие между списками и кортежами в Python?
2. Напишите программу, которая запрашивает у пользователя строку и выводит на экран список, полученный из символов этой строки.
Пример входных данных | Пример выходных данных |
---|---|
Python | ['P', 'y', 't', 'h', 'o', 'n'] |
JavaScript | ['J', 'a', 'v', 'a', 'S', 'c', 'r', 'i', 'p', 't'] |
PHP | ['P', 'H', 'P'] |
3. Почему при создании кортежа из одного элемента необходимо ставить запятую после него? Что произойдет, если этого не сделать?
4. Напишите программу, которая создаёт список ["Раз", "Два", "Раз", "Два", "Раз", "Два"]
с помощью операции умножения и выводит его на экран.
5. Напишите программу, которая выводит на экран индекс первого вхождения числа 5
в список [1, 3, 5, 7, 5]
.
6. Напишите программу, которая подсчитывает, сколько раз строка "Физика"
встречается в кортеже ("Физика", "Физика", "Математика", "Русский язык", "История")
и выводит результат на экран.