Пустое множество буквально?

461

[] = пусто list

() = пусто tuple

{} = пусто dict

Есть ли подобное обозначение для пустого set? Или я должен написать set()?

Йохан Род
источник
12
Вы не принимаете {я, потому что я в []}, не так ли?
Утдемир
3
Просто хочу показать, что почти все возможно с питоном. Если вы хотите создать набор без использования set (), вы можете.
Утдемир
6
Да, вы можете сделать почти все сотнями убедительных способов. Я не добавляю map(lambda x: x)к своему коду примеры, чтобы показать вам, что это тоже работает. Это также не буквальный набор, это просто наборное понимание.
130
Тупой способ, который работает, был бы {0}-{0}. Это не так ясно, как set(), но у него есть преимущество в виде забавной пары глаз.
Вим
10
@ Крис {}это словарь. {0}это набор. {0} - {0}это разница между набором и самим собой, который является пустым набором.
Майклсноуден

Ответы:

519

Нет, для пустого набора нет буквального синтаксиса. Вы должны написать set().

sepp2k
источник
Вы имеете в виду, что для пустого набора нет буквального синтаксиса? Или для наборов вообще?
Йохан Род
15
Существуют заданные литералы, но только в Python 3.x. В любом случае не существует литерала для пустых множеств.
2
@ user763305: Руководство по языку довольно ясно в этом вопросе. docs.python.org/library/stdtypes.html#set-types-set-frozenset говорит, что "непустые множества ... можно создать, поместив разделенный запятыми список элементов в фигурных скобках"
S.Lott
44
На самом деле, заданные литералы перенесены в Python 2.7, поэтому они доступны не только строго в Python 3.
Джим Бриссом
13
@andy Это не пустой набор - это набор, содержащий число 1. Кстати, запятая не нужна - это требуется только для кортежей.
sepp2k
54

В любом случае, пожалуйста, используйте set() для создания пустого набора.

Но, если вы хотите произвести впечатление на людей, скажите им, что вы можете создать пустой набор, используя литералы и *с Python> = 3.5 ( см. PEP 448 ), выполнив:

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()

это в основном более сжатый способ {_ for _ in ()}, но не делайте этого.

Димитрис Фасаракис Хиллиард
источник
Почему?! Производительность практически идентична:$ python3.7 -m timeit 'set()' 2000000 loops, best of 5: 177 nsec per loop $ python3.7 -m timeit '{*()}' 2000000 loops, best of 5: 171 nsec per loop
огурец
9
@ogurets, set()вероятно, гораздо проще для понимания (для разработчиков кода), и это часто имеет большее значение, чем производительность. {*()}кажется "умным" в почти уничижительном смысле.
Бенджимин
Хех, это умно.
Ковальский
46

Просто чтобы расширить принятый ответ:

От версии 2.7и 3.1Python получил setбуквальное {}в форме использования {1,2,3}, но {}сам по-прежнему используется для пустых слов.

Python 2.7 (первая строка недопустима в Python <2.7)

>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>

Python 3.x

>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>

Подробнее здесь: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes

Reishin
источник
12
Этот ответ неверен. До сих пор нет буквального синтаксиса для представления пустого набора. {}.__class__все равно отдал быdict
Ninja420
8
@ Ninja420 попробуйте сначала прочитать перед комментарием, я заметил это
Рейшин
3
Принятый ответ остается верным и не устарел. Не существует буквального синтаксиса для пустого набора , однако есть один для пустого словаря.
AndreasHassing
2
@ AndreasBjørn для пустого yes, однако для непустого вы получите исключение PEP8 и предложение использовать set literal.
Рейшин
на самом деле, {}.__class__возвращается <class 'dict'>'с pyt3.6, а не<type 'dict'>
klew
6

Это зависит от того, хотите ли вы литерал для сравнения или для назначения.

Если вы хотите сделать существующий набор пустым, вы можете использовать .clear()метод, особенно если вы хотите избежать создания нового объекта. Если вы хотите сделать сравнение, используйте set()или проверьте, если длина равна 0.

пример:

#create a new set    
a=set([1,2,3,'foo','bar'])
#or, using a literal:
a={1,2,3,'foo','bar'}

#create an empty set
a=set()
#or, use the clear method
a.clear()

#comparison to a new blank set
if a==set():
    #do something

#length-checking comparison
if len(a)==0:
    #do something
Брайан Минтон
источник
8
a=set()не очищает набор , но создает новый набор и присваивает его a, перезаписывая любое предыдущее значение.
Gerrit
Верно. Вот почему я сказал, что если вы хотите избежать создания нового объекта, вы должны использовать clear (). Полагаю, мой комментарий должен был быть сформулирован несколько иначе.
Брайан Минтон
Также кажется, что использование a.clear()метода немного быстрее, чем a=set()проверка, и проверка len(a)==0немного быстрее, чем проверка на равенствоa==set()
Брайан Минтон,
3
Вместо if len(a)==0:этого достаточно (и более Pythonic) написать просто if a: (edit: или, скорее, if not a:чтобы соответствовать полярности условия).
Джим Олдфилд
2

Добавление к сумасшедшим идеям: с Python 3, принимающим идентификаторы Unicode, вы можете объявить переменную ϕ = frozenset()(ϕ - U + 03D5) и использовать ее вместо этого.

Ренато Гарсия
источник
4
Проблема в том, что setобъекты изменчивы, поэтому вы подвергаете себя риску spam = ϕ; spam.add("eggs").
drdaeman
3
Если ϕэто Frozenset, то происходит spam.add("eggs")сбой, потому что объект Frozenset не имеет никакого addметода.
Брайан Минтон
1
@BrianMinton: Но это предполагаемое поведение. Обратите внимание , что , когда кто - то пишет , span = ϕкак spanи ϕбудет указывать на тот же объект, то есть id(span) == id(ϕ). Следовательно, если spam.add("eggs")бы это работало, ϕобъект больше не был бы пустым множеством, и мы вернемся к исходной проблеме, на которую указывает drdaeman
Ренато Гарсия
1
@RenatoGarcia Сравните с пустым буквальным dict:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Брайан Минтон
1

Да. То же самое обозначение, которое работает для непустых dict / set, работает для пустых.

Обратите внимание на разницу между непустыми dictи setлитералами:

{1: 'a', 2: 'b', 3: 'c'}- количество пар ключ-значение внутри составляет dict
{'aaa', 'bbb', 'ccc'}- кортеж значений внутри делаетset

Так:

{}== нулевое количество пар ключ-значение == пусто dict
{*()}== пустая кортеж значений == пустоset

Однако тот факт, что вы можете это сделать, не означает, что вы должны это делать. Если у вас нет веских причин, лучше явно создать пустой набор, например:

a = set()

NB : Как заметил ctrueden в комментариях, {()}это не пустой набор. Это набор с 1 элементом: пустой кортеж.

pycoder
источник
2
{()}это не пустой набор. Это одноэлементное множество с одним элементом: пустой кортеж. Вы можете проверить это, проверив, len({()})что будет 1, или () in {()}, что будет True.
ctrueden
1
Ой, ты прав! Я обновил пост: добавил примечание о том, что он {()}не является пустым набором, на случай, если кто-то еще совершит ту же ошибку. Спасибо, @ctrueden!
Пикодер
-1

Есть несколько способов создать пустой набор в Python:

  1. Использование метода set ()
    Это встроенный метод в python, который создает пустой набор в этой переменной.
  2. Использование метода clear () (Creative Engineer Technique LOL).
    См. Этот пример:

    sets = {"Hi", "How", "are", "You", "All"}
    type (sets) (This Line Output: set)
    sets .clear ()
    print (sets) (Выход этой строки: {})
    Тип (sets) (Выход этой строки: set)

Итак, это 2 способа создать пустой Set.

Встретить шаха
источник