Списки и кортежи
Списки и кортежи – это упорядоченные коллекции, которые могут хранить элементы различных типов данных. Их ключевое различие заключается в изменяемости: списки являются изменяемыми объектами, в то время как кортежи – неизменяемыми. Это означает, что после создания кортежа вы не можете добавить, удалить или изменить его элементы, в отличие от списка, который поддерживает эти операции.
Списки, благодаря своей гибкости, являются одним из наиболее часто используемых типов данных в Python. Кортежи в свою очередь идеально подходят для хранения набора фиксированных значений, обеспечивая целостность данных, занимая (в некоторых случаях) меньше памяти и демонстрируя более высокую производительность при переборе элементов.
Выбор между списком и кортежем обычно диктуется требованиями конкретной задачи, в частности необходимостью изменения хранимых данных.
Создание списка
Существует несколько способов создания списков в Python.
Квадратные скобки для создания списка
Список создаёт перечисление элементов через запятую внутри квадратных скобок:
emperors = ["Пётр I", "Пётр II", "Пётр III"]
Функция list() для создания списка
Любую встроенную коллекцию можно преобразовать в список с помощью функции list().
|
Функция |
|
|
Описание |
Создаёт список из всех объектов коллекции |
|
Параметры |
|
|
Возвращаемое значение |
Список |
Список, созданный из кортежа, сохранит как сами элементы кортежа, так и их порядок:
famous_places = ("Эрмитаж", "Петропавловская крепость", "Летний сад")
print(list(famous_places))
# Вывод: ['Эрмитаж', 'Петропавловская крепость', 'Летний сад']
Однако порядок элементов в списке, полученном из множества, непредсказуем, так как элементы множества не упорядочены:
famous_sculptures = {"Венера Милосская", "статуя Давида"}
print(list(famous_sculptures))
# Вывод: ['статуя Давида', 'Венера Милосская']
Элементами строки являются символы, из которых она состоит, поэтому список, созданный из строки, включает в себя все отдельные символы строки:
famous_poem = "Одиссея"
print(list(famous_poem))
# Вывод: ['О', 'д', 'и', 'с', 'с', 'е', 'я']
При создании списка из словаря по умолчанию используются его ключи:
famous_arts = {"Мона Лиза": 1506, "Рождение Венеры": 1486}
print(list(famous_arts))
# Вывод: ['Мона Лиза', 'Рождение Венеры']
Но мы можем получить последовательность значений словаря с помощью метода dict.values() и преобразовать её в список:
famous_arts = {"Мона Лиза": 1506, "Рождение Венеры": 1486}
print(list(famous_arts.values()))
# Вывод: [1506, 1486]
Создание пустого списка
Пустой список создают функция list() без аргументов и пустые квадратные скобки:
emperors_achievements = list()
emperors_achievements = []
Создание кортежа
Кортежи также можно создавать несколькими способами.
Запятая для создания кортежа
Кортеж создаёт перечисление элементов через запятуювнутри круглых скобок или без круглых скобок:
empress1 = ("Екатерина I", "Анна I")
empress2 = "Елизавета I", "Екатерина II"
Здесь в обоих случаях создаются кортежи, так как кортеж создаёт именно запятая, а не скобки. Это используется при множественном присваивании, когда элементы кортежа распаковываются в отдельные переменные:
empress2 = "Елизавета I", "Екатерина II"
empress_i, empress_ii = empress2
print(empress_i, empress_ii)
# Вывод: Екатерина I Екатерина II
Поэтому при создании кортежа из одного элемента, после него нужно обязательно ставить запятую:
princess = ("Анна Павловна",)
Без запятой Python интерпретирует выражение как обычное значение типа элемента:
princess = ("Анна Павловна ")
print(type(princess))
# Вывод: <class 'str'>
Благодаря тому, что скобки не создают кортеж, мы можем заключать в них длинные строки, и Python интерпретирует это как одну логическую строку.
Функция tuple() для создания кортежа
Как и в список, любую встроенную коллекцию можно преобразовать в кортеж с помощью функции tuple().
|
Функция |
|
|
Описание |
Создаёт кортеж из всех объектов коллекции |
|
Параметры |
|
|
Возвращаемое значение |
Кортеж |
Тогда, например, из строки будет создан кортеж, состоящий из символов, а из списка, или множества – из элементов:
house = "Палеологи"
print(tuple(house))
# Вывод: ('П', 'а', 'л', 'е', 'о', 'л', 'о', 'г', 'и')
children = ["Анна Палеологина", "Мануил Палеолог"]
print(tuple(children))
# Вывод: ('Анна Палеологина', 'Мануил Палеолог')
languages = {"Греческий язык", "Латинский язык", "Итальянский язык"}
print(tuple(languages))
# Вывод: ('Греческий язык', 'Итальянский язык', 'Латинский язык')
Создание пустого кортежа
Пустой кортеж создают функция tuple() без аргументов и пустые круглые скобки:
empresses_achievements = tuple()
empresses_achievements = ()
Сложение и умножение списков и кортежей
Списки и кортежи поддерживают операции сложения (конкатенации) и умножения (повторения), аналогичные строкам.
Сложение списков и кортежей
Конкатенация списков или кортежей создаёт новый список или кортеж, состоящий из всех элементов объединяемых коллекций:
infantry = ("Стрельцы", "Копейщики", "Гренадеры")
cavalry = ("Рыцари", "Гусары")
warriors = infantry + cavalry
print(warriors)
# Вывод: ('Стрельцы', 'Копейщики', 'Гренадеры', 'Рыцари', 'Гусары')
Как и при сложении строк и чисел, списки и кортежи допускают использование оператора сложения с присваиванием (+=), который добавляет элементы второй коллекции в конец первой:
history_books = ["Римская история", " Персидский огонь", "От Руси до Рос-сии"]
china_history_books = ["Китай династии Хань", "Вечный Китай"]
history_books += china_history_books
print(history_books)
# Вывод: ['Римская история', ' Персидский огонь', 'От Руси до России', 'Китай династии Хань', 'Вечный Китай']
Кортежи неизменяемы, поэтому оператор += работает как для строк и создаёт новый кортеж, который присваивает переменной слева. Однако списки изменяемы, поэтому оператор += изменяет исходный список, не создавая новый объект в памяти.
Умножение списков и кортежей
Умножение списка или кортежа на целое число n похоже на умножение строки на число и создаёт новую коллекцию, в которой исходная последовательность повторяется n раз:
battle_cries = ["За родину!", "За Сталина!"]
more_battle_cries = battle_cries * 3
print(more_battle_cries)
# Вывод: ['За родину!', 'За Сталина!', 'За родину!', 'За Сталина!', 'За родину!', 'За Сталина!']
Как и конкатенация, данная операция поддерживает оператор умножения с присваиванием (*=):
polite_phrases = ("Хорошего дня!", "Хороших выходных!")
polite_phrases *= 3
print(polite_phrases)
# Вывод: ('Хорошего дня!', 'Хороших выходных!', 'Хорошего дня!', 'Хороших выходных!', 'Хорошего дня!', 'Хороших выходных!')
В таком случае будет изменено значение исходного списка или создан объект с новым кортежем, который будет присвоен переменной слева.
Поиск элементов в списках и кортежах
Как и для строк, для поиска индекса первого вхождения искомого элемента в кортеж или список используется метод index().
|
Методы |
|
|
Описание |
Возвращают начальный индекс первого вхождения объекта |
|
Параметры |
Необязательные параметры:
|
|
Возвращаемое значение |
Целое число |
По умолчанию поиск ведётся во всей коллекции:
grades = [4, 4, 5, 5, 4, 5]
print(grades.index(4))
# Вывод: 0
Но также мы можем ограничить область поиска с помощью среза [start:end]:
schedule = ("Русский язык", "Математика", "Математика", "Информатика")
print(schedule.index("Математика", 2, 4))
# Вывод: 2
Здесь первый найденный элемент имеет индекс 2, так как такой же элемент с индексом 1 исключен из поиска с помощью среза.
Если искомый элемент отсутствует в коллекции, метод вызывает исключение ValueError:
schedule = ["Русский язык", "Математика", "Математика", "Информатика"]
print(schedule.index("Литература"))
# Ошибка: ValueError: 'Литература' is not in list
Подсчёт количества вхождений элемента в список или кортеж
Метод count() подсчитывает количество вхождений элемента в список или кортеж.
|
Методы |
|
|
Описание |
Возвращают количество вхождений объекта item в список list или кортеж tuple |
|
Параметры |
Необязательные параметры:
|
|
Возвращаемое значение |
Целое число |
Как и при использовании метода index(), мы можем подсчитывать элемент во всей коллекции или ограничить область подсчёта с помощью среза [start:end]:
breakfast = ["Чай", "Печенье", "Печенье", "Печенье", "Варенье"]
print(breakfast.count("Печенье"))
# Вывод: 3
spoons = ("Столовая ложка", "Чайная ложка", "Столовая ложка", "Чайная лож-ка")
print(spoons.count("Чайная ложка"))
# Вывод: 2
Примеры
Пример 1. Генератор расписания
Система управления расписанием генерирует шаблон расписания на день на основе повторяющихся событий:
base_schedule = ("Лекция", "Практика", "Перерыв")
full_day = base_schedule * 3
for i, item in enumerate(full_day, 1):
print(f"{i}. {item}")
Вывод:
1. Лекция
2. Практика
3. Перерыв
4. Лекция
5. Практика
6. Перерыв
7. Лекция
8. Практика
9. Перерыв
Пример 2. Извлечение информации о сотруднике
Система получает информацию о сотруднике из базы данных в виде кортежа и присваивает каждый его элемент отдельной переменной для дальнейшей обработки:
user_record = (101, "Лагерта", "Лодброк", "ladgerda.l@example.ru")
# Распаковываем кортеж в отдельные переменные
user_id, first_name, last_name, email = user_record
print(f"ID пользователя: {user_id}")
print(f"Имя: {first_name}")
print(f"Фамилия: {last_name}")
print(f"Email: {email}")
Вывод:
ID пользователя: 101
Имя: Лагерта
Фамилия: Лодброк
Email: ladgerda.l@example.ru
Пример 3. Отчёт по успеваемости студента
Программа подсчитывает количество разных оценок студента по предмету
grades = [4, 5, 3, 5, 4, 5, 3, 4, 5, 2, 3, 5]
# Цикл проходит по последовательности оценок: 2, 3, 4, 5
for i in range(2, 6):
count_i = grades.count(i) # Подсчёт количества текущей оценки
print(f"Количество {i}: {count_i}")
Вывод:
Количество 2: 1
Количество 3: 3
Количество 4: 3
Количество 5: 5
Итоги
- Функция
list()преобразует другую коллекцию в список. - Функция
tuple()преобразует другую коллекцию в кортеж. - Кортеж определяется наличием запятой, поэтому не обязательно заключать его элементы в круглые скобки.
- Сложение (конкатенация) списков или кортежей создаёт новый список или кортеж, состоящий из всех элементов объединяемых коллекций
- Умножение списка или кортежа нацелое число n создаёт новую коллекцию, в которой исходная последовательность повторяется n раз.
- Методы
list.index()иtuple.index()возвращают начальный индекс первого вхождения искомого объекта в списокlistили кортежtuple. - Методы
list.count()иtuple.count()возвращают количество вхождений искомого объекта в списокlistили кортежtuple.
Задания для самопроверки
1. Чем отличаются списки от кортежей?
Списки являются изменяемыми, а кортежи – неизменяемыми.
2. Запросите у пользователя строку и выведите на экран список, полученный из символов этой строки.
|
Пример входных данных |
Пример выходных данных |
|---|---|
|
|
|
|
|
|
|
|
|
s = input("Введите строку: ")
print(list(s))
3. Почему при создании кортежа из одного элемента необходимо ставить запятую после него? Что произойдет, если этого не сделать?
Запятая создаёт кортеж. Без запятой Python интерпретирует выражение как обычное значение (например, строку, если элемент является строкой).
4. Дан список words = ["Раз", "Два"]. Используя оператор *, создайте из него список ["Раз", "Два", "Раз", "Два", "Раз", "Два"] и выведите его на экран.
lst = ["Раз", "Два"]
lst *= 3
print(lst)
# Вывод: ["Раз", "Два", "Раз", "Два", "Раз", "Два"]
5. Выведите на экран индекс первого вхождения числа 5 в список [1, 3, 5, 7, 5].
lst = [1, 3, 5, 7, 5]
print(lst.index(5))
# Вывод: 2
6. Выведите на экран количество вхождений строки "Физика" в кортеж ("Физика", "Физика", "Математика", "Русский язык", "История").
subjects = ("Физика", "Физика", "Математика", "Русский язык", "История")
print(subjects.count("Физика"))
# Вывод: 2
0 комментариев