Порожній набір буквально?


460

[] = порожній list

() = порожній tuple

{} = порожній dict

Чи є подібне позначення для порожнього set? Або я повинен писати set()?


12
ви не приймаєте {i for i in []}, чи не так?
utdemir

3
Просто хочу показати майже все, що можливо з python. Якщо ви хочете створити набір, не використовуючи set (), ви можете.
utdemir

6
Так, ти можеш зробити майже все за сотню конвультів. Я не додаю map(lambda x: x)до своїх прикладів коду просто для того, щоб показати вам, що він також працює. Це також не буквальний набір, це лише розуміння набору.

130
Тупий спосіб, який би працював {0}-{0}. Це не так зрозуміло, як set(), але має перевагу виглядати як смішна пара очей.
Вім

10
@Chris {}- словник. {0}- це набір. {0} - {0}- це різниця між множиною і самим собою, що є порожнім набором.
michaelsnowden

Відповіді:


520

Ні, немає порожнього синтаксису для порожнього набору. Треба писати set().


Ви маєте на увазі, що для порожнього набору немає буквального синтаксису? Або для наборів взагалі?
Йохан Реде

15
Є встановлені літерали, але тільки в Python 3.x. Для пустих наборів не буває буквально.

2
@ user763305: Навчальний посібник з мов щодо цього досить чіткий. docs.python.org/library/stdtypes.html#set-types-set-frozenset говорить, що "непусті набори ... можна створити, розмістивши розділений комою список елементів у дужках"
С.Лотт

43
Насправді, встановлені літерали були підкріплені до Python 2.7, тому вони доступні не лише в Python 3.
Джим Бріссом,

13
@andy Це не порожній набір - це набір, що містить число 1. Ви не знаєте, що триває кома, до речі, це потрібно лише для кортежів.
sepp2k

53

У будь-якому випадку, будь ласка, використовуйте 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
ogurets

9
@ogurets, set()ймовірно, набагато простіше зрозуміти (для обслуговуючого коду), і це часто має значення більше, ніж продуктивність. {*()}здається "розумним" у майже пейоративному сенсі.
benjimin

Хе, це розумно.
Ковальський

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


12
Ця відповідь неправильна. Досі немає буквального синтаксису, який би представляв порожній набір. {}.__class__все одно дадутьdict
Ninja420

8
@ Ninja420 спробуйте прочитати спочатку перед коментарем, я помітив це
Reishin

3
Прийнята відповідь як і раніше правильна і не застаріла. Існує не буквальний синтаксис для порожнього набору , проте є один для порожнього словника.
AndreasHassing

2
@ AndreasBjørn для порожнього так, однак для не порожнього ви отримаєте виняток PEP8 та пропозицію використовувати встановлений літерал.
Reishin

фактично, {}.__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, перезаписуючи будь-яке попереднє значення.
Герріт

Справді. Ось чому я сказав, що якщо ви хочете уникнути створення нового об’єкта, вам слід скористатися clear (). Я вважаю, що мій коментар повинен був бути сформульований дещо інакше.
Брайан Мінтон

Це також з'являється за допомогою a.clear()методу трохи швидше a=set(), а перевірка len(a)==0трохи швидше, ніж перевірка рівностіa==set()
Брайан Мінтон

3
Замість if len(a)==0:цього достатньо (і більше піфонічно) писати просто if a: (редагувати: а точніше, if not a:відповідати полярності умови).
Джим Олдфілд

2

Додавання до шалених ідей: з Python 3, який приймає ідентифікатори unicode, ви можете оголосити змінну ϕ = frozenset()(ϕ - U + 03D5) і використовувати її замість неї.


4
Проблема полягає в тому, що setоб'єкти змінюються, тому ви ставите себе під загрозу spam = ϕ; spam.add("eggs").
drdaeman

3
якщо ϕце заморожений набір, він spam.add("eggs")не працює, тому що об'єкт заморожений не має жодного addметоду.
Брайан Мінтон

1
@BrianMinton: Але це призначена поведінка. Зауважте, що коли хтось пише span = ϕобидва spanі ϕвкаже на один і той же об’єкт, тобто id(span) == id(ϕ). Отже, якщо spam.add("eggs")він запрацює, ϕоб’єкт більше не буде порожнім набором, і ми повернемося до первісної проблеми, на яку вказував drdaeman
Ренато Гарсія

1
@RenatoGarcia Порівняйте з пустим буквальним словом:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Брайан Мінтон

1

Так. Та сама позначення, яка працює для не порожнього диктату / встановлення, працює для порожніх.

Зауважте різницю між непустими dictта setбуквальними:

{1: 'a', 2: 'b', 3: 'c'}- кількість пар ключів і значень всередині складає a dict
{'aaa', 'bbb', 'ccc'}- набір значень усередині робить aset

Тому:

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

Однак факт, що ти можеш це зробити, не означає, що слід. Якщо у вас немає серйозних причин, краще побудувати порожній набір явно, наприклад:

a = set()

NB : Як зауважено в коментарях, {()}це не порожній набір. Це набір з 1 елементом: порожній кортеж.


2
{()}не є порожнім набором. Це одиночний набір з одним елементом: порожній кортеж. Ви можете перевірити це, перевіривши, len({()})який буде 1, або () in {()}який буде True.
ctrueden

1
На жаль, ви праві! Я оновив публікацію: додав замітку про те, що {()}не пустий набір, на випадок, якщо хтось ще зробить ту саму помилку. Дякую, @ctrueden!
пікодер

-1

Є кілька способів створити порожній набір у Python:

  1. Використовуючи набір () метод
    Це вбудований метод в Python , який створює порожня множина в цієї змінної.
  2. З допомогою методу Clear () (творчий інженер Техніка LOL)
    Дивіться в цьому прикладі:

    набори = { «Привіт», «Як», «є», «Ви», «Все»}
    типу (набори) (Це лінійний вихід: набір)
    набори .clear ()
    print (набори) (This Line Output: {})
    type (sets) (This Line Output: set)

Отже, це 2 способи створення порожнього набору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.