Используйте фигурные скобки для инициализации набора в Python

105

Я изучаю python, и у меня есть вопрос для новичков об инициализации наборов. В ходе тестирования я обнаружил, что набор можно инициализировать следующим образом:

my_set = {'foo', 'bar', 'baz'}

Есть ли недостатки в использовании этого способа по сравнению со стандартным способом:

my_set = set(['foo', 'bar', 'baz'])

или это просто вопрос стиля?

fvrghl
источник
2
В документации это упоминается, но не там. Обратите внимание, что это документация для устаревшего модуля, настоящие наборы теперь встроены. Он находится в документе «Что нового в Python 2.7», и в справочнике по языку он кратко описан: docs.python.org/2/reference/expressions.html#set-displays
@delnan Я использую python 2.7, поэтому не подумал заглядывать в документы python 3. Ссылка, которую я опубликовал, предназначена для 2.7, но, как ни странно, об этом не упоминается.
fvrghl
1
С тех пор я редактировал свой комментарий, в документах 2.7 также упоминается об этом. Публикуемая вами ссылка устарела, является пережитком прошлого, неправильная, устаревшая. Забудьте о его существовании и используйте вместо него то, что он сам говорит вам: docs.python.org/2/library/stdtypes.html#set и docs.python.org/2/library/stdtypes.html#frozenset
@delnan Спасибо, что помог мне. Я отредактировал вопрос так, что больше не говорю, что для него нет документации (хотя в Интернете есть несколько примеров, упоминающих это).
fvrghl
Для прохожего: Pycharm предостерегает от использования вызова функции, когда можно использовать литерал - могут быть причины производительности - так что
лучше

Ответы:

106

Есть две очевидные проблемы с синтаксисом set literal:

my_set = {'foo', 'bar', 'baz'}
  1. Он недоступен до Python 2.7.

  2. Невозможно выразить пустой набор с помощью этого синтаксиса (использование {}создает пустой dict)

Они могут быть важны для вас, а могут и не быть.

Раздел документации, описывающий этот синтаксис, находится здесь .

bgporter
источник
50

Сравните также разницу между аргументом из одного слова {}и set()с ним.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

но оба aи bявляются наборами, конечно.

Thruston
источник
4
вот почему я люблю напоминать себе конструктор множества как, set([])а не просто set().
Майкл Экока
4
set()всегда беру единственный аргумент. Одна итерация.
Джордж Кеттлборо
1
@GeorgeKettleborough с одним аргументом или без аргументов, последний - для создания пустого набора.
gertvdijk
28

Из документации Python 3 ( то же самое и для Python 2.7 ):

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

в python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

Имейте в виду, что {}это также используется для map/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

Также можно использовать исчерпывающий синтаксис для инициализации наборов:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])
0x90
источник
1

Вам нужно сделать empty_set = set()для инициализации пустой набор. {}это пустой словарный запас.

Арджун
источник