Создание множеств: {} и set() — литерал, список, строка
Два способа создать множество: литерал в фигурных скобках и set() от списка или строки. Пустые скобки — это словарь, поэтому пустое множество пишут set().
Редакция Питоники
В прошлом уроке множество впервые появилось на сцене — теперь соберём все способы его создания в один урок. Их два: литерал с элементами в фигурных скобках и функция set(), которая собирает множество из готовой коллекции — списка, строки, другого множества. Звучит просто, но именно здесь прячется самая знаменитая ловушка Python: пустые фигурные скобки создают вовсе не множество. Разберём каждый способ и добьём ловушку до конца.
Два способа: литерал и 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
В слове шесть букв, уникальных четыре: множество разобрало строку на символы и выкинуло повторы. Это самый короткий способ ответить, из каких букв состоит слово, или найти уникальные символы пароля:
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Элементы множества достают циклом 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 — самый короткий способ отличить созданное множество от словаря. А что случится с недопустимым аргументом, видно на числе: перебирать его нельзя.
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))
1. Что вернёт set(['x', 'x', 'y'])?
2. Что такое {} в Python?
3. Как правильно создать пустое множество?
4. Что вернёт set('кот')?
5. Что произойдёт при вызове set(42)?
6. Что вернёт len(set('мама'))?
Дана строка word = 'программирование'. Соберите множество уникальных букв и напечатайте три строки: всего букв, уникальных букв и отсортированный список букв.
Как создать пустое множество в 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-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Множества · Урок 3
add и update в Python: добавление элементов в set
Множество собрано — теперь пополняем: add кладёт один элемент, update принимает списки, множества и даже строки. Дубликаты исчезают тихо, без ошибок.
Множества · Урок 1
Set в Python: первое множество и исчезающие дубликаты
Список терпит дубликаты, множество — нет: {1, 3, 3} хранит каждый элемент один раз. Первое множество, исчезающие повторы и честная печать через sorted.
Множества · Урок 12
Кортеж против списка в Python: что и когда использовать
У обоих есть индексы, len и in, но список можно менять, а кортеж — нет. Четыре отличия: изменяемость, ключ словаря, память и правило выбора за три секунды.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Строки · Урок 18
Строки и списки: перевод туда-обратно
Строка ведёт себя почти как список символов, но с одним запретом — на изменение. Учимся свободно переводить строку в список и обратно и использовать силу обоих миров.
python строка в списокlist python строка
Словари · Урок 2
Создание словаря: фигурные скобки и dict()
Три способа создать словарь: литерал в фигурных скобках, dict() из списка пар и пустой словарь под наполнение. Плюс разбор, какие ключи годятся и почему fromkeys с пустым списком — ловушка.
dict python созданиесоздание словаря python
Множества · Урок 18
Задачи на множества Python: практика с решениями
Четыре задачи на множества из жизни данных: уникальные посетители журнала, общие друзья, первый неповторяющийся элемент и гости, пришедшие оба дня. Код, вывод и разбор каждого шага.
python задачи множествазадачи на множества python с решением