Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 2 из 20 Начальный 15 мин 100 XP

Создание множеств: {} и set() — литерал, список, строка

Два способа создать множество: литерал в фигурных скобках и set() от списка или строки. Пустые скобки — это словарь, поэтому пустое множество пишут set().

Редакция Питоники

В прошлом уроке множество впервые появилось на сцене — теперь соберём все способы его создания в один урок. Их два: литерал с элементами в фигурных скобках и функция set(), которая собирает множество из готовой коллекции — списка, строки, другого множества. Звучит просто, но именно здесь прячется самая знаменитая ловушка Python: пустые фигурные скобки создают вовсе не множество. Разберём каждый способ и добьём ловушку до конца.

Два способа: литерал и set()

Литерал удобен, когда элементы известны заранее: перечисляем их в фигурных скобках через запятую. Функция set() — когда коллекция уже собрана в списке, например пришла из журнала:

литерал и set() от списка
colors_literal = {'красный', 'зелёный', 'синий'}
colors_from_list = set(['красный', 'зелёный', 'синий', 'красный'])
print(sorted(colors_literal))
print(sorted(colors_from_list))
print(len(colors_literal), len(colors_from_list))
Вывод
['зелёный', 'красный', 'синий']
['зелёный', 'красный', 'синий']
3 3

Оба пути привели к одинаковым множествам из трёх цветов: set() отбросил четвёртый, повторный элемент списка. Выбор между способами — вопрос удобства: литерал для констант в коде, set() — когда элементы приходят из данных.

set() от списка: разбор и подсчёт

Типичный источник списков — журнал: запросы к сайту, события, письма. Множество отвечает на вопрос, какие значения встретились, за один вызов:

методы из журнала запросов
logs = ['get', 'post', 'get', 'put', 'post']
methods = set(logs)
print('запросов:', len(logs))
print('методов:', len(methods))
print(sorted(methods))
Вывод
запросов: 5
методов: 3
['get', 'post', 'put']

Пять запросов, три метода — множество сжало журнал до перечня уникальных значений. Обратное превращение — из множества обратно в список — делается той же функцией с другой стороны: list(methods). Эта пара трюков, включая тонкость с потерей порядка, разобрана в уроке про дубликаты одной строкой.

set() от строки: уникальные символы

set() принимает любую перебираемую величину, и строка — перебираемая: по ней можно идти в цикле. Поэтому set() от строки собирает её уникальные буквы:

уникальные буквы слова
chars = set('молоко')
print(sorted(chars))
print(len('молоко'), len(chars))
Вывод
['к', 'л', 'м', 'о']
6 4

В слове шесть букв, уникальных четыре: множество разобрало строку на символы и выкинуло повторы. Это самый короткий способ ответить, из каких букв состоит слово, или найти уникальные символы пароля:

колокол: 7 букв, 3 уникальные
word = 'колокол'
letters = set(word)
print('букв в слове:', len(word))
print('уникальных букв:', len(letters))
print(sorted(letters))
Вывод
букв в слове: 7
уникальных букв: 3
['к', 'л', 'о']

Семь букв слова, три уникальных: к, л, о. Разность длин подсказывает, сколько символов повторилось — приём годится для быстрых проверок, например на повторы в коротких строках. Ещё одно следствие отсутствия порядка: у множества нет индексов. Обратиться к первому элементу нельзя — нет ни первого, ни второго:

обращение по индексу падает
methods = {'get', 'post'}
print(methods[0])
Вывод
Traceback (most recent call last):
  File "app.py", line 2, in <module>
    print(methods[0])
          ~~~~~~~^^^
TypeError: 'set' object is not subscriptable
Программа падает на обращении по индексу: у множества их нет. Путь к файлу в traceback будет вашим (показан условный app.py).

Элементы множества достают циклом for и проверкой in — последняя мгновенна и разобрана в уроке про оператор in. Порядок для печати собирает sorted: он возвращает список, а списки индексируют свободно.

Пустое множество — только set()

Теперь главная ловушка. По логике списков хочется написать пустые скобки и получить пустое множество. Но в Python фигурные скобки делят с словарями, и без элементов они означают словарь:

пустые скобки дают словарь
empty = set()
print(len(empty))
print(type(empty).__name__)
d = {}
print(type(d).__name__)
Вывод
0
set
dict

Две строчки рядом — и два разных типа: set() дал множество нулевой длины, {} — словарь. Разница не только в названии: у словарей и множеств разные операции. Убедимся, что пустые скобки действительно ведут себя как словарь:

фигурные скобки ведут себя как словарь
d = {}
d['анна'] = 2
print(d['анна'])
Вывод
2

В запись с фигурными скобками молча добавилась пара ключ-значение — так ведёт себя словарь, а не множество. Программа не упала и не пожаловалась: ошибка прячется дальше по коду, там, где вместо множества внезапно окажется dict. Поэтому правило стоит выучить как рефлекс: пустое множество пишут set(), всегда.

Таблица: выражение и результат

Соберём все способы создания в одну таблицу — она стоит на скриншоте в каждом втором споре о множествах:

ВыражениеРезультатПояснение
{}Пустой словарь (dict)Скобки без элементов достались словарям
set()Пустое множествоЕдинственный способ создать пустой set
{'a', 'b'}Множество из двух строкЛитерал с элементами — это set
set(['a', 'a', 'b'])Множество из двух строкДубликат списка исчез при создании
set('ab')Множество символов: a, bСтрока разбирается на буквы

Сравнение через type — самый короткий способ отличить созданное множество от словаря. А что случится с недопустимым аргументом, видно на числе: перебирать его нельзя.

set(42) падает
try:
    set(42)
except TypeError as e:
    print('Ошибка:', e)
print(len(set(range(5))))
Вывод
Ошибка: 'int' object is not iterable
5

Число не перебирается — set() требует величину, по которой можно идти. Зато range подходит: set(range(5)) собрал пять чисел в множество. Правило простое: то, что умеет for, умеет и set().

Все способы создания на руках: литерал для перечисленных значений, set() для списков и строк, set() для пустого множества. Дальше элементы множества нужно пополнять по одному и пачками — этим занимаются add и update из следующего урока, а первое множество для разминки ждёт в уроке 1.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

letters = set('анана')
print(len(letters))
print(sorted(letters))
empty = set()
d = {}
print(type(empty).__name__, type(d).__name__)
nums = set([1, 2, 2, 3, 3, 3])
print(len(nums), sorted(nums))
Проверь себя
0 / 6

1. Что вернёт set(['x', 'x', 'y'])?

2. Что такое {} в Python?

3. Как правильно создать пустое множество?

4. Что вернёт set('кот')?

5. Что произойдёт при вызове set(42)?

6. Что вернёт len(set('мама'))?

Карточки терминов
Запомнено: 0 / 7
Практика

Дана строка word = 'программирование'. Соберите множество уникальных букв и напечатайте три строки: всего букв, уникальных букв и отсортированный список букв.

practice.py
Вопросы и ответы по уроку

Как создать пустое множество в Python?

Только функцией set() без аргументов. Пустые фигурные скобки {} создают пустой словарь — фигурные скобки в Python обслуживают две структуры, и без элементов они означают dict. Проверить, что получилось, можно через type(x).__name__.

Урок 1: первое множество

Чем set() отличается от {}?

set() без аргументов — пустое множество; {} — пустой словарь. {'a', 'b'} с элементами — множество. То есть разница проявляется только в пустом случае: элементы в фигурных скобках дают set, а словарю нужны пары ключ-значение через двоеточие.

Как получить уникальные символы строки?

Одной функцией: set(строка) разбирает текст на буквы и отбрасывает повторы. Для предсказуемой печати оберните в sorted: sorted(set('молоко')) вернёт список уникальных букв по возрастанию.

Как превратить список в множество и обратно?

list(set(список)) — множество отфильтрует дубликаты, list вернёт список. Порядок элементов при этом не сохраняется: множества его не помнят. Если порядок важен, используйте dict.fromkeys — приём разобран в уроке про дубликаты.

Урок 12: дубликаты одной строкой

Почему set(42) падает с ошибкой?

set() принимает один аргумент-перебираемое: список, строку, кортеж, range — всё, по чему можно идти в цикле. Число не перебирается, поэтому Python отвечает TypeError: 'int' object is not iterable. Правило: если величина умеет for, она умеет и set().

Понравился урок? Сошлитесь на него

«Пустое множество в Python создаётся только через set(): пустые фигурные скобки — это словарь.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.

Строки · Урок 18

Строки и списки: перевод туда-обратно

Строка ведёт себя почти как список символов, но с одним запретом — на изменение. Учимся свободно переводить строку в список и обратно и использовать силу обоих миров.

python строка в списокlist python строка

Словари · Урок 2

Создание словаря: фигурные скобки и dict()

Три способа создать словарь: литерал в фигурных скобках, dict() из списка пар и пустой словарь под наполнение. Плюс разбор, какие ключи годятся и почему fromkeys с пустым списком — ловушка.

dict python созданиесоздание словаря python

Множества · Урок 18

Задачи на множества Python: практика с решениями

Четыре задачи на множества из жизни данных: уникальные посетители журнала, общие друзья, первый неповторяющийся элемент и гости, пришедшие оба дня. Код, вывод и разбор каждого шага.

python задачи множествазадачи на множества python с решением