Перебор множеств
Узнайте, как перебирать множества Python с помощью for, while, enumerate, break, continue и генераторов множеств — с понятными примерами.
Множества в Python — это неупорядоченные коллекции уникальных элементов. Поскольку они неупорядочены, обращаться к элементам по индексу нельзя — однако можно перебрать каждый элемент с помощью цикла for, обрабатывать множество в цикле while и применять операции над множествами внутри циклов для решения распространённых задач с данными.
На этой странице рассматривается, как перебирать множества в Python: детерминированная итерация с sorted(), enumerate(), фильтрация с помощью break и continue, генераторы множеств и практические примеры использования.
Создание множества
Перед тем как перебирать элементы, нужно создать множество. Это можно сделать с помощью фигурных скобок {} или встроенной функции set(). Подробное введение см. в разделе Python Sets.
Создание множества в Python
# Using curly braces
fruits = {'apple', 'banana', 'cherry'}
# Using set() — useful when converting another sequence
numbers = set([1, 2, 2, 3, 4, 4, 5])
print(numbers) # {1, 2, 3, 4, 5} — duplicates are removedОбратите внимание: set(), применённый к списку, автоматически удаляет дубликаты. Порядок вывода не гарантирован.
Перебор множества с помощью цикла for
Самый распространённый способ итерации по множеству — цикл for. Python обходит каждый элемент ровно один раз, но в произвольном порядке.
Итерация по множеству в Python
Результат выполнения может быть таким:
banana
cherry
appleПорядок может меняться при каждом запуске программы. Если нужен предсказуемый порядок, оберните множество в sorted().
Итерация в отсортированном порядке
sorted() возвращает обычный список с элементами множества в порядке возрастания. Исходное множество при этом не изменяется.
Перебор множества в отсортированном порядке
fruits = {'apple', 'banana', 'cherry'}
for fruit in sorted(fruits):
print(fruit)Вывод:
apple
banana
cherryИспользуйте sorted(my_set, reverse=True) для итерации в порядке убывания.
Использование enumerate() с множеством
enumerate() сопоставляет каждому элементу счётчик. В сочетании с sorted() это даёт стабильный индекс рядом с каждым элементом.
Enumerate для множества в Python
fruits = {'apple', 'banana', 'cherry'}
for index, fruit in enumerate(sorted(fruits)):
print(index, fruit)Вывод:
0 apple
1 banana
2 cherryЭто удобно, когда нужно пронумеровать элементы в отчёте или подписать их в конвейере обработки данных.
Перебор с break и continue
Используйте break для досрочного выхода из цикла и continue для пропуска отдельных элементов.
Использование continue для пропуска элементов
Пропуск элементов при переборе множества
scores = {55, 72, 88, 64}
for score in sorted(scores):
if score < 60:
continue # skip failing scores
print(score)Вывод:
64
72
88Использование break для досрочного выхода
Досрочный выход из цикла с помощью break
scores = {55, 72, 88, 91, 64}
for score in sorted(scores):
if score >= 90:
print(f'First score at 90 or above: {score}')
breakВывод:
First score at 90 or above: 91Перебор множества с помощью цикла while
Цикл while в сочетании с pop() позволяет последовательно обрабатывать и извлекать элементы из множества. Этот шаблон удобен, когда нужно «опустошать» множество по ходу работы (например, очередь задач).
Использование цикла while для обработки множества
tasks = {'send email', 'write report', 'update database'}
while tasks:
task = tasks.pop() # removes and returns an arbitrary element
print(f'Processing: {task}')
print('All tasks done.')Вывод (порядок может отличаться):
Processing: update database
Processing: write report
Processing: send email
All tasks done.После завершения цикла tasks будет пустым. Если нужно сохранить исходное множество, работайте с его копией: tasks.copy().
Проверка вхождения внутри цикла
Одно из главных преимуществ множеств — проверка вхождения за O(1). Выражение item in my_set выполняется значительно быстрее, чем item in my_list для больших коллекций, поскольку множества используют хэш-таблицу внутри.
Фильтрация списка с использованием множества для быстрого поиска
allowed_roles = {'admin', 'editor', 'viewer'}
users = ['admin', 'guest', 'editor', 'unknown']
for user in users:
if user in allowed_roles:
print(f'{user}: access granted')
else:
print(f'{user}: access denied')Вывод:
admin: access granted
guest: access denied
editor: access granted
unknown: access deniedЭтот шаблон широко применяется для проверки прав доступа, списков блокировок и фильтрации данных.
Удаление дубликатов из списка
Преобразование списка в множество внутри цикла — быстрый способ гарантировать, что каждое уникальное значение будет обработано только один раз.
Удаление дубликатов из списка с помощью множества
my_list = [1, 2, 2, 3, 4, 4, 5]
unique_values = set(my_list) # duplicates removed
for value in sorted(unique_values):
print(value)Вывод:
1
2
3
4
5Перебор результатов операций над множествами
Можно перебирать результат операции над множествами — объединения, пересечения, разности — напрямую, без создания промежуточной переменной.
Перебор результатов операций над множествами в Python
Вывод:
Intersection:
3
4
Difference (set1 - set2):
1
2
Symmetric difference:
1
2
5
6Подробнее об объединении множеств см. в разделе Join Sets, а полный список операций — в Set Methods.
Генераторы множеств
Генератор множества создаёт новое множество из выражения в одну строку. Синтаксис аналогичен генераторам списков, но использует фигурные скобки.
Создание множества с помощью генератора
# Squares of numbers 1 through 5
squares = {x**2 for x in range(1, 6)}
print(sorted(squares))Вывод:
[1, 4, 9, 16, 25]Можно добавить условие для фильтрации элементов:
Генератор множества с фильтром
numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
evens = {n for n in numbers if n % 2 == 0}
print(sorted(evens))Вывод:
[2, 4, 6, 8, 10]Генераторы множеств лаконичнее, чем цикл for с вызовом .add() в теле, и наглядно выражают намерение. Эквиваленты для списков см. в разделе List Comprehension.
Ключевые выводы
- Множества неупорядочены — не полагайтесь на порядок итерации. Используйте
sorted(), если нужен стабильный порядок. - Множества содержат уникальные элементы — итерация автоматически исключает дубликаты.
- Проверка вхождения
inдля множеств — O(1), что значительно быстрее, чем для списков при больших объёмах данных. pop()удаляет произвольный элемент и удобен для обработки множества в циклеwhile.- Генераторы множеств
{expr for item in iterable}— идиоматический способ создать отфильтрованное или преобразованное множество в одну строку.
Связанные темы
- Python Sets — создание, добавление и удаление элементов
- Add Set Items — методы
add()иupdate() - Remove Set Items — методы
remove(),discard()иpop() - Join Sets — объединение, пересечение, разность и другие операции
- Set Methods — полный справочник по методам множеств
- Python For Loops — цикл
forв деталях - Loop Lists — итерация по спискам
- Loop Tuples — итерация по кортежам
- Loop Dictionaries — итерация по словарям