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

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

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

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

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

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

Ответ 1

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

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

  • Невозможно выразить пустой набор, используя этот синтаксис (используя {} создает пустой dict)

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

Раздел документов, излагающих этот синтаксис, здесь.

Ответ 2

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

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

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

Ответ 3

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

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

в питоне 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', '{', '}'])