Перебор элементов коллекций
Все встроенные коллекции в Python, такие как списки, кортежи, строки, множества и словари, объединяет то, что они являются итерируемыми объектами (англ. iterable object), то есть такими объектами, которые поддерживает возможность последовательного прохода по своим элементам. Это означает, что мы можем перебрать каждый элемент таких коллекций в цикле for
:
for элемент in коллекция:
действия_с_элементом
Основное преимущество итерируемых объектов заключается в том, что цикл for
берет на себя работу по перебору элементов. Вместо того чтобы вручную обращаться к каждому элементу по индексу или ключу, мы можем последовательно обработать каждый элемент такого объекта.
Давайте посмотрим на простой пример:
fruits = ["Яблоко", "Банан", "Апельсин"]
for fruit in fruits:
print(fruit)
# Вывод: Яблоко
# Вывод: Банан
# Вывод: Апельсин
Здесь цикл for
проходит по каждому элементу списка fruits
. На каждой итерации переменная fruit
принимает значение очередного элемента списка.
Таким способом мы можем можно перебирать элементы любой встроенной коллекции, например, все символы строки:
movie = "Тор"
for char in movie:
print(char)
# Вывод: Т
# Вывод: о
# Вывод: р
Или все элементы множества:
elements = {"Вода", "Огонь", "Земля", "Воздух"}
for element in elements:
print(f"Ваш элемент - {el}")
# Вывод: Ваш элемент - Вода
# Вывод: Ваш элемент - Огонь
# Вывод: Ваш элемент - Земля
# Вывод: Ваш элемент - Воздух
Однако при переборе словарей, представляющих собой набор пар «ключ-значение», следует учитывать некоторые особенности.
Перебор элементов словаря
По умолчанию цикл for
перебирает ключи словаря:
student_data = {"Имя": "Михаил", "Фамилия": "Романов", "Возраст": 19}
for data in student_data:
print(data)
# Вывод: Имя
# Вывод: Фамилия
# Вывод: Возраст
Последовательность значений словаря позволяет получить метод dict.values()
.
Метод | dict.values() |
Описание | Возвращает последовательность значений словаря dict |
Возвращаемое значение | Последовательность значений |
Такую последовательность можно перебрать в цикле for
:
student_data = {"Имя": "Михаил", "Фамилия": "Романов", "Возраст": 19}
for data in student_data.values():
print(data)
# Вывод: Михаил
# Вывод: Романов
# Вывод: 19
Также существует специальный метод dict.keys()
, который позволяет явно получить последовательность ключей словаря.
Метод | dict.keys() |
Описание | Возвращает последовательность ключей словаря dict |
Возвращаемое значение | Последовательность ключей |
Результат перебора такой последовательности будет совпадать с результатом перебора самого словаря:
student_data = {"Имя": "Михаил", "Фамилия": "Романов", "Возраст": 19}
for data in student_data.keys():
print(data)
# Вывод: Имя
# Вывод: Фамилия
# Вывод: Возраст
Однако наиболее распространенный способ перебора словаря – использование метода dict.items()
, который возвращает последовательность пар (ключ, значение)
.
Метод | dict.items() |
Описание | Возвращает последовательность пар (ключ, значение) словаря dict |
Возвращаемое значение | Последовательность пар (ключ, значение) |
В таком случае после ключевого слова for
объявляется не одна, а две переменные: для ключей и для значений:
stats = {"Здоровье": 162, "Сила атаки": 34}
for key, value in stats.items():
print(f"{key} - {value}")
# Вывод: Здоровье - 162
# Вывод: Сила атаки - 34
Перебор элементов по индексу в цикле for
Строки, списки и кортежи – это упорядоченные коллекции, то есть у каждого элемента есть свой порядковый номер (индекс), по которому можно обратиться к этому элементу. При этом индексы образуют последовательность целых чисел от 0
до индекса последнего элемента коллекции, которую можно создать с помощью функции range()
и перебрать в цикле for
.
Перебор индексов в цикле for
Чтобы узнать, сколько всего элементов хранится в любой встроенной коллекции, мы можем использовать функцию len()
.
Функция | len(iterable) |
Описание | Возвращает количество элементов коллекции iterable |
Параметры | iterable – коллекция, количество элементов которой требуется определить |
Возвращаемое значение | Целое число |
Например, определим количество элементов в списке:
heroes = ["Чип", "Дейл", "Гаечка", "Вжик", "Рокфор"]
print(len(heroes))
# Вывод: 5
В списке 5 элементов, поэтому его индексы представляют собой последовательность чисел от 0
до 4
. Такую последовательность чисел от 0
до len() - 1
удобно сгенерировать через функцию range()
и перебрать в цикле for
:
heroes = ["Чип", "Дейл", "Гаечка", "Вжик", "Рокфор"]
for i in range(len(heroes)):
print(heroes[i])
# Вывод: Чип
# Вывод: Дейл
# Вывод: Гаечка
# Вывод: Вжик
# Вывод: Рокфор
Здесь переменная i
последовательно принимает значение от 0
до 2
, поэтому на каждой итерации цикла мы обращаемся к соответствующему элементу коллекции heroes[i]
.
Перебор пар (индекс, значение) в цикле for
Однако для получения индекса необязательно использовать конструкцию range(len())
, так как существует специальная функция enumerate()
, возвращающая кортеж из номера итерации цикла, который по умолчанию совпадает с индексом, и значения, полученного из итерации по объекту.
Функция | enumerate(sequence, start=0) |
Описание | Возвращает кортеж (индекс, значение) для каждого элемента упорядоченной коллекции sequence |
Параметры | sequence – упорядоченная коллекция (список, кортеж или строка)Необязательные параметры: start – значение, с которого начинается отсчёт |
Возвращаемое значение | Кортеж (индекс, значение) |
В таком случае в цикле for
для индекса и для значения следует объявить две переменные, перечисленные через запятую:
planets = ("Кибертрон", "Татуин", "Солярис")
for index, value in enumerate(planets):
print(f"Планета {value} находится по индексу {index}")
# Вывод: Планета Кибертрон находится по индексу 0
# Вывод: Планета Татуин находится по индексу 1
# Вывод: Планета Солярис находится по индексу 2
Для того, чтобы начать отсчёт не с 0, мы можем присвоить параметру start
какое-то значение, например, 100:
celestials = ["Аришем", "Эсон", "Незарр"]
for num, value in enumerate(celestials, 100):
print(f"Целестиал {value} под номером {num}")
# Вывод: Целестиал Аришем под номером 100
# Вывод: Целестиал Эсон под номером 101
# Вывод: Целестиал Незарр под номером 102
Однако тогда первое значение, полученное с помощью функции enumerate()
, уже не совпадает с индексом соответствующего элемента.
Перебор элементов по индексу в цикле while
Перебирать элементы упорядоченных коллекций по индексу позволяет не только цикл for
, но и цикл while
:
robins = ["Дик Грейсон", "Тим Дрейк", "Джейсон Тодд"]
i = 0
while i < len(robins):
print(f"Лучший Робин - {robins[i]}")
i += 1
# Вывод: Лучший Робин - Дик Грейсон
# Вывод: Лучший Робин - Тим Дрейк
# Вывод: Лучший Робин - Джейсон Тодд
В таком случае мы вручную управляем индексом i
, увеличивая его на каждой итерации, пока не достигнем конца коллекции.
1. Напишите программу, которая запрашивает у пользователя целое число n
и выводит на экран все чётные числа из последовательности от 2
до n
на одной строке через пробел.
Пример входных данных | Пример выходных данных |
---|---|
8 | 2 4 6 8 |
17 | 2 4 6 8 10 12 14 16 |
12 | 2 4 6 8 10 12 |
2. Дан кортеж colors = ("Красный", "Синий", "Зеленый")
. Напишите программу, которая для каждого цвета выводит сообщение "Цвет под номером {индекс + 1} - {цвет}"
. Используйте цикл for
и функцию enumerate()
.
3. Дано множество unique_numbers = {5, 2, 8, 2, 9, 5}
. Напишите код, который выведет все элементы этого множества. Обратите внимание на то, что дубликаты будут выведены только один раз.
4. Дан словарь city_population = {"Москва": 13149803, "Санкт-Петербург": 5597763, "Владивосток": 622782}
. Напишите программу, которая выведет названия население каждого города в формате: "{Город} - население {количество}"
.
5. Напишите программу, которая запрашивает у пользователя строку и выводит на экран каждой символ этой строки через пробел. Используйте цикл while
.
Пример входных данных | Пример выходных данных |
---|---|
Мышь | М ы ш ь |
Провод | П р о в о д |
Ток | Т о к |