W3docs

Перебор множеств

Узнайте, как перебирать множества 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

python— editable, runs on the server

Результат выполнения может быть таким:

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

python— editable, runs on the server

Вывод:

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 — итерация по словарям

Практика

Практика
Which of the following is true about loop sets in Python?
Which of the following is true about loop sets in Python?
Was this page helpful?