Вы не принимаете {я, потому что я в []}, не так ли?
Утдемир
3
Просто хочу показать, что почти все возможно с питоном. Если вы хотите создать набор без использования set (), вы можете.
Утдемир
6
Да, вы можете сделать почти все сотнями убедительных способов. Я не добавляю map(lambda x: x)к своему коду примеры, чтобы показать вам, что это тоже работает. Это также не буквальный набор, это просто наборное понимание.
130
Тупой способ, который работает, был бы {0}-{0}. Это не так ясно, как set(), но у него есть преимущество в виде забавной пары глаз.
Вим
10
@ Крис {}это словарь. {0}это набор. {0} - {0}это разница между набором и самим собой, который является пустым набором.
Майклсноуден
Ответы:
519
Нет, для пустого набора нет буквального синтаксиса. Вы должны написать set().
Вы имеете в виду, что для пустого набора нет буквального синтаксиса? Или для наборов вообще?
Йохан Род
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)
Этот ответ неверен. До сих пор нет буквального синтаксиса для представления пустого набора. {}.__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 setif a==set():#do something#length-checking comparisonif len(a)==0:#do something
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) и использовать ее вместо этого.
Проблема в том, что 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 элементом: пустой кортеж.
{()}это не пустой набор. Это одноэлементное множество с одним элементом: пустой кортеж. Вы можете проверить это, проверив, len({()})что будет 1, или () in {()}, что будет True.
ctrueden
1
Ой, ты прав! Я обновил пост: добавил примечание о том, что он {()}не является пустым набором, на случай, если кто-то еще совершит ту же ошибку. Спасибо, @ctrueden!
Пикодер
-1
Есть несколько способов создать пустой набор в Python:
Использование метода set ()
Это встроенный метод в python, который создает пустой набор в этой переменной.
Использование метода clear () (Creative Engineer Technique LOL).
См. Этот пример:
sets = {"Hi", "How", "are", "You", "All"}
type (sets) (This Line Output: set)
sets .clear ()
print (sets) (Выход этой строки: {})
Тип (sets) (Выход этой строки: set)
map(lambda x: x)
к своему коду примеры, чтобы показать вам, что это тоже работает. Это также не буквальный набор, это просто наборное понимание.{0}-{0}
. Это не так ясно, какset()
, но у него есть преимущество в виде забавной пары глаз.{}
это словарь.{0}
это набор.{0} - {0}
это разница между набором и самим собой, который является пустым набором.Ответы:
Нет, для пустого набора нет буквального синтаксиса. Вы должны написать
set()
.источник
В любом случае, пожалуйста, используйте
set()
для создания пустого набора.Но, если вы хотите произвести впечатление на людей, скажите им, что вы можете создать пустой набор, используя литералы и
*
с Python> = 3.5 ( см. PEP 448 ), выполнив:это в основном более сжатый способ
{_ 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
set()
вероятно, гораздо проще для понимания (для разработчиков кода), и это часто имеет большее значение, чем производительность.{*()}
кажется "умным" в почти уничижительном смысле.Просто чтобы расширить принятый ответ:
От версии
2.7
и3.1
Python получилset
буквальное{}
в форме использования{1,2,3}
, но{}
сам по-прежнему используется для пустых слов.Python 2.7 (первая строка недопустима в Python <2.7)
Python 3.x
Подробнее здесь: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
источник
{}.__class__
все равно отдал быdict
{}.__class__
возвращается<class 'dict'>'
с pyt3.6, а не<type 'dict'>
Это зависит от того, хотите ли вы литерал для сравнения или для назначения.
Если вы хотите сделать существующий набор пустым, вы можете использовать
.clear()
метод, особенно если вы хотите избежать создания нового объекта. Если вы хотите сделать сравнение, используйтеset()
или проверьте, если длина равна 0.пример:
источник
a=set()
не очищает набор , но создает новый набор и присваивает егоa
, перезаписывая любое предыдущее значение.a.clear()
метода немного быстрее, чемa=set()
проверка, и проверкаlen(a)==0
немного быстрее, чем проверка на равенствоa==set()
if len(a)==0:
этого достаточно (и более Pythonic) написать простоif a:
(edit: или, скорее,if not a:
чтобы соответствовать полярности условия).Добавление к сумасшедшим идеям: с Python 3, принимающим идентификаторы Unicode, вы можете объявить переменную
ϕ = frozenset()
(ϕ - U + 03D5) и использовать ее вместо этого.источник
set
объекты изменчивы, поэтому вы подвергаете себя рискуspam = ϕ; spam.add("eggs")
.ϕ
это Frozenset, то происходитspam.add("eggs")
сбой, потому что объект Frozenset не имеет никакогоadd
метода.span = ϕ
какspan
иϕ
будет указывать на тот же объект, то естьid(span) == id(ϕ)
. Следовательно, еслиspam.add("eggs")
бы это работало,ϕ
объект больше не был бы пустым множеством, и мы вернемся к исходной проблеме, на которую указывает drdaeman>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Да. То же самое обозначение, которое работает для непустых dict / set, работает для пустых.
Обратите внимание на разницу между непустыми
dict
иset
литералами:{1: 'a', 2: 'b', 3: 'c'}
- количество пар ключ-значение внутри составляетdict
{'aaa', 'bbb', 'ccc'}
- кортеж значений внутри делаетset
Так:
{}
== нулевое количество пар ключ-значение == пустоdict
{*()}
== пустая кортеж значений == пустоset
Однако тот факт, что вы можете это сделать, не означает, что вы должны это делать. Если у вас нет веских причин, лучше явно создать пустой набор, например:
NB : Как заметил ctrueden в комментариях,
{()}
это не пустой набор. Это набор с 1 элементом: пустой кортеж.источник
{()}
это не пустой набор. Это одноэлементное множество с одним элементом: пустой кортеж. Вы можете проверить это, проверив,len({()})
что будет 1, или() in {()}
, что будетTrue
.{()}
не является пустым набором, на случай, если кто-то еще совершит ту же ошибку. Спасибо, @ctrueden!Есть несколько способов создать пустой набор в Python:
Это встроенный метод в python, который создает пустой набор в этой переменной.
См. Этот пример:
sets = {"Hi", "How", "are", "You", "All"}
type (sets) (This Line Output: set)
sets .clear ()
print (sets) (Выход этой строки: {})
Тип (sets) (Выход этой строки: set)
Итак, это 2 способа создать пустой Set.
источник