Use llaves para inicializar un conjunto en Python

98

Estoy aprendiendo Python y tengo una pregunta de principiante sobre la inicialización de conjuntos. A través de las pruebas, descubrí que un conjunto se puede inicializar así:

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

¿Hay alguna desventaja de hacerlo de esta manera, a diferencia de la forma estándar de:

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

¿O es solo una cuestión de estilo?

fvrghl
fuente
2
La documentación lo menciona, pero no está allí. Tenga en cuenta que esa es la documentación de un módulo obsoleto, los conjuntos reales ahora están incorporados. Está en el documento "Novedades de Python 2.7", y la referencia del lenguaje lo describe brevemente: docs.python.org/2/reference/expressions.html#set-displays
@delnan Uso Python 2.7, así que no pensé en buscar en los documentos de Python 3. El enlace que publiqué es para 2.7, pero extrañamente no menciona esto.
fvrghl
1
Desde que edité mi comentario, los documentos 2.7 también mencionan esto. El enlace que publicó está desactualizado, una reliquia del pasado, incorrecto, obsoleto. Olvídese de que existe y use lo que él mismo le dice que use en su lugar: docs.python.org/2/library/stdtypes.html#set y docs.python.org/2/library/stdtypes.html#frozenset
@delnan Gracias por ayudarme. Edité la pregunta para que ya no diga que no hay documentación para ella (aunque hay algunos ejemplos que mencionan esto en línea).
fvrghl
Para el transeúnte: Pycharm advierte contra el uso de una llamada de función cuando se puede usar un literal; puede haber razones de rendimiento, así que prefiera la forma literal establecida en el nuevo código
Mr_and_Mrs_D

Respuestas:

102

Hay dos problemas obvios con la sintaxis literal establecida:

my_set = {'foo', 'bar', 'baz'}
  1. No está disponible antes de Python 2.7

  2. No hay forma de expresar un conjunto vacío usando esa sintaxis (usando {}crea un dict vacío)

Esos pueden ser importantes para usted o no.

La sección de los documentos que describe esta sintaxis está aquí .

bgporter
fuente
46

Compare también la diferencia entre {}y set()con un argumento de una sola palabra.

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

pero ambos ay bson conjuntos por supuesto.

Thruston
fuente
4
es por eso que me gusta recordarme a mí mismo el constructor de conjuntos como en set([])lugar de solo set().
Michael Ekoka
3
set()siempre tome un solo argumento. Un solo iterable.
George Kettleborough
1
@GeorgeKettleborough un solo argumento o ningún argumento, este último para crear un conjunto vacío.
gertvdijk
28

De la documentación de Python 3 ( lo mismo vale para Python 2.7 ):

Se pueden utilizar llaves o la función set () para crear conjuntos. Nota: para crear un conjunto vacío tienes que usar set (), no {}; el último crea un diccionario vacío, una estructura de datos que discutimos en la siguiente sección.

en python 2.7:

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

Tenga en cuenta que {}también se utiliza para map/ dict:

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

También se puede utilizar una sintaxis completa 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
fuente
1

Debe hacerlo empty_set = set()para inicializar un conjunto vacío. {}soy un dictionaty vacío.

Arjjun
fuente