Use chaves para inicializar um conjunto em Python

98

Estou aprendendo python e tenho uma pergunta novata sobre a inicialização de conjuntos. Por meio de testes, descobri que um conjunto pode ser inicializado assim:

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

Há alguma desvantagem em fazer isso dessa maneira, em oposição à maneira padrão de:

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

ou é apenas uma questão de estilo?

fvrghl
fonte
2
A documentação menciona isso, mas não está lá. Observe que essa é a documentação para um módulo obsoleto, os conjuntos reais agora estão integrados. Ele está no documento "O que há de novo no Python 2.7" e a referência de linguagem o descreve resumidamente: docs.python.org/2/reference/expressions.html#set-displays
@delnan Eu uso o python 2.7, então não pensei em olhar na documentação do python 3. O link que postei é para o 2.7, mas estranhamente não menciona isso.
fvrghl
1
Desde que editei meu comentário, os documentos 2.7 também mencionam isso. O link que você postou está desatualizado, uma relíquia do passado, errado, obsoleto. Esqueça que ele existe e use o que ele mesmo diz para você usar: docs.python.org/2/library/stdtypes.html#set e docs.python.org/2/library/stdtypes.html#frozenset
@delnan Obrigado por me ajudar. Editei a pergunta para não dizer mais que não há documentação para ela (embora haja alguns exemplos mencionando isso online).
fvrghl
Para quem passa: Pycharm avisa contra o uso de uma chamada de função quando se pode usar um literal - pode haver motivos de desempenho - então prefira definir a forma literal no novo código
Mr_and_Mrs_D

Respostas:

102

Existem dois problemas óbvios com a sintaxe literal definida:

my_set = {'foo', 'bar', 'baz'}
  1. Não está disponível antes do Python 2.7

  2. Não há como expressar um conjunto vazio usando essa sintaxe (usando {}cria um dicionário vazio)

Isso pode ou não ser importante para você.

A seção da documentação que descreve essa sintaxe está aqui .

bgporter
fonte
46

Compare também a diferença entre {}e set()com um argumento de uma única palavra.

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

mas ambos ae bsão conjuntos, é claro.

Thruston
fonte
4
é por isso que gosto de me lembrar do construtor do conjunto como em set([])vez de apenas set().
Michael Ekoka,
3
set()sempre use um único argumento. Um único iterável.
George Kettleborough
1
@GeorgeKettleborough um único ou nenhum argumento, o último para criar um conjunto vazio.
gertvdijk
28

Da documentação do Python 3 ( o mesmo vale para o python 2.7 ):

Os colchetes ou a função set () podem ser usados ​​para criar conjuntos. Nota: para criar um conjunto vazio, você deve usar set (), não {}; o último cria um dicionário vazio, uma estrutura de dados que discutiremos na próxima seção.

em python 2.7:

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

Esteja ciente de que {}também é usado para map/ dict:

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

Também é possível usar uma sintaxe abrangente para inicializar conjuntos:

>>> 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
fonte
1

Você precisa fazer empty_set = set()para inicializar um conjunto vazio. {}é um dicionário vazio.

Arjjun
fonte