W3docs

Доступ к элементам множества

Узнайте, как обращаться к элементам множества в Python: итерация, проверка принадлежности и преобразование в список — с примерами и пояснениями.

Множества в Python — это неупорядоченные коллекции уникальных элементов. Поскольку множества не имеют гарантированного порядка, они не поддерживают индексирование, срезы или иной доступ в стиле последовательностей. В этой главе рассматриваются все практические способы получения элементов из множества: итерация, проверка принадлежности, преобразование в список и несколько реальных паттернов, показывающих, зачем нужен каждый из подходов.

Почему нельзя индексировать множество

Попытка обратиться к элементу множества по позиции немедленно вызывает TypeError:

Индексирование множества вызывает TypeError

python— editable, runs on the server

Так задумано. Множества хранят элементы в хеш-таблице, а не в последовательности, поэтому стабильной «первой» или «второй» позиции не существует. Порядок элементов, который вы видите при выводе множества, может меняться между версиями Python и даже между запусками.

Итерация по множеству

Стандартный способ обойти все элементы — цикл for. Поскольку порядок не гарантирован, элементы могут появляться в любой последовательности при каждом запуске цикла.

Обход каждого элемента множества

python— editable, runs on the server

Типичный вывод (порядок может отличаться):

cherry
banana
apple

Сбор результатов в процессе итерации

Во время итерации можно построить новый список преобразованных значений:

Построить список фруктов в верхнем регистре из множества

my_set = {"apple", "banana", "cherry"}
upper_fruits = [item.upper() for item in my_set]
print(upper_fruits)  # e.g. ['CHERRY', 'BANANA', 'APPLE']

Списковое включение работает, потому что оно запрашивает у множества по одному элементу за раз — никакой индекс не нужен.

Проверка принадлежности с in и not in

Самый быстрый и распространённый способ проверить, есть ли значение в множестве, — оператор in. Поскольку множества реализованы на основе хеш-таблицы, эта проверка выполняется за O(1) в среднем — намного быстрее, чем перебор списка.

Проверить, есть ли элемент в множестве

python— editable, runs on the server

Используйте not in для проверки отсутствия:

Проверить, отсутствует ли элемент в множестве

fruits = {"apple", "banana", "cherry"}
search = "mango"

if search not in fruits:
    print(f"{search} is not in the collection")
# mango is not in the collection

Практический пример: дедупликация и фильтрация списка

Распространённый паттерн сочетает множества с проверкой принадлежности для фильтрации одного списка по другому:

Оставить только элементы списка, которых нет в известном множестве

seen = {"apple", "cherry"}
candidates = ["apple", "mango", "banana", "cherry", "kiwi"]

new_items = [item for item in candidates if item not in seen]
print(new_items)  # ['mango', 'banana', 'kiwi']

Это намного быстрее, чем if item not in seen_list, когда seen велик.

Преобразование множества в список для доступа по индексу

Когда действительно нужен доступ по позиции, сначала преобразуйте множество в список. Помните, что получившийся порядок произвольный, если вы явно не отсортируете.

Преобразовать множество в отсортированный список и обратиться по индексу

my_set = {"cherry", "apple", "banana"}
sorted_list = sorted(my_set)     # ['apple', 'banana', 'cherry']
print(sorted_list[0])            # apple
print(sorted_list[-1])           # cherry

sorted() всегда возвращает новый список; исходное множество остаётся неизменным.

Использование any() и all() с множествами

any() и all() работают с любым итерируемым объектом, включая множества, и позволяют проверять условия по всем элементам без явного цикла.

Проверить, выполняется ли условие для некоторых или всех элементов

numbers = {2, 4, 6, 8}

print(any(n > 5 for n in numbers))   # True  (6 and 8 are > 5)
print(all(n % 2 == 0 for n in numbers))  # True  (all are even)

Получение одного произвольного элемента

Если нужен просто один элемент и неважно какой, можно использовать next() вместе с iter():

Получить один элемент без изменения множества

my_set = {"apple", "banana", "cherry"}
first = next(iter(my_set))
print(first)  # one of the three fruits — which one is unspecified

Это распространённый паттерн, когда нужно проверить множество, которое заведомо непусто, не удаляя из него элементы и не изменяя его.

Сводка способов доступа

СпособКогда использовать…
for item in my_setНужно обойти каждый элемент
item in my_setНужно проверить принадлежность (O(1))
item not in my_setНужно проверить отсутствие
sorted(my_set)[i]Нужен доступ по позиции (сначала сортирует)
next(iter(my_set))Нужен один произвольный элемент
any() / all()Нужно проверить условие по всем элементам

Связанные главы

Практика

Практика
What are the ways to access set items in Python?
What are the ways to access set items in Python?
Was this page helpful?