Conjunto vacío literal?


461

[] = vacío list

() = vacío tuple

{} = vacío dict

¿Hay una notación similar para un vacío set? ¿O tengo que escribir set()?


12
no aceptas {i for i en []}, ¿verdad?
utdemir

3
Solo quiero mostrar que casi todo es posible con Python. Si desea crear un conjunto sin usar to set (), puede hacerlo.
utdemir

66
Sí, puedes hacer casi todo de cien maneras convulsionadas. No agrego map(lambda x: x)a mis ejemplos de código solo para mostrarle que funciona tampoco. Tampoco es un conjunto literal, es solo una comprensión establecida.

130
Una manera tonta que funciona sería {0}-{0}. No es tan claro como set(), pero tiene la ventaja de parecer un par de ojos divertidos.
wim

10
@Chris {}es un diccionario. {0}es un conjunto. {0} - {0}es la diferencia entre un conjunto y sí mismo, que es el conjunto vacío.
michaelsnowden

Respuestas:


519

No, no hay sintaxis literal para el conjunto vacío. Tienes que escribir set().


¿Quiere decir que no hay una sintaxis literal para el conjunto vacío? ¿O para sets en general?
Johan Råde

15
Hay literales establecidos, pero solo en Python 3.x. No hay un literal para conjuntos vacíos de ninguna manera.

2
@ user763305: El manual del idioma es bastante claro en este punto. docs.python.org/library/stdtypes.html#set-types-set-frozenset dice que "los conjuntos no vacíos ... se pueden crear colocando una lista de elementos separados por comas entre llaves"
S.Lott

44
En realidad, los literales establecidos se han exportado a Python 2.7, por lo que no solo están disponibles estrictamente en Python 3.
Jim Brissom

13
@andy Ese no es un conjunto vacío, es un conjunto que contiene el número 1. Por cierto, no necesitas la coma final, eso solo es necesario para las tuplas.
sepp2k

54

Por supuesto, úselo set() para crear un conjunto vacío.

Pero, si desea impresionar a las personas, dígales que puede crear un conjunto vacío usando literales y *con Python> = 3.5 ( consulte PEP 448 ) haciendo lo siguiente:

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()

esta es básicamente una forma más condensada de hacer {_ for _ in ()}, pero no hagas esto.


¡¿Por qué?! El rendimiento es casi idéntico:$ 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

99
@ogurets, set()es probable que sea mucho más fácil de entender (para los encargados del mantenimiento del código), y eso a menudo es más importante que el rendimiento. {*()}parece "inteligente" en un sentido casi peyorativo.
benjimin

Je, eso es inteligente.
Kowalski

46

Solo para extender la respuesta aceptada:

Desde la versión 2.7y 3.1Python tiene setliteral {}en forma de uso {1,2,3}, pero en {}sí mismo se usa para dict vacío.

Python 2.7 (la primera línea no es válida en Python <2.7)

>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>

Python 3.x

>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>

Más aquí: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes


12
Esta respuesta es incorrecta. Todavía no hay una sintaxis literal para representar un conjunto vacío. {}.__class__todavía daríadict
Ninja420

8
@ Ninja420 intenta leer primero antes de comentar, me he dado cuenta de eso
Reishin

3
La respuesta aceptada sigue siendo correcta y no está desactualizada. No hay una sintaxis literal para el conjunto vacío , sin embargo, hay una para el diccionario vacío.
AndreasHassing

2
@ AndreasBjørn para un sí vacío, sin embargo, para no vacío obtendrá una excepción PEP8 y una sugerencia para usar set literal.
Reishin

en realidad, {}.__class__regresa <class 'dict'>'con pyt3.6, no<type 'dict'>
produjo el

6

Depende de si desea el literal para una comparación o para una asignación.

Si desea que un conjunto existente esté vacío, puede usar el .clear()método, especialmente si desea evitar crear un nuevo objeto. Si desea hacer una comparación, use set()o verifique si la longitud es 0.

ejemplo:

#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()no vacía el conjunto , pero crea un nuevo conjunto y lo asigna a, sobrescribiendo cualquier valor anterior.
gerrit

En efecto. Es por eso que dije que si quieres evitar crear un nuevo objeto, debes usar clear (). Supongo que mi comentario debería haber sido redactado de manera ligeramente diferente.
Brian Minton

También aparece utilizando el a.clear()método es ligeramente más rápido que a=set(), comprobación y len(a)==0es ligeramente más rápido que la comprobación de la igualdad dea==set()
Brian Minton

3
En lugar de eso if len(a)==0:es suficiente (y es más pitónico) escribir solo if a: (editar: o más bien, if not a:para que coincida con la polaridad de la condición).
Jim Oldfield

2

Además de las ideas locas: con Python 3 aceptando identificadores Unicode, podría declarar una variable ϕ = frozenset()(ϕ es U + 03D5) y usarla en su lugar.


44
El problema es que los setobjetos son mutables, por lo que te estás poniendo en riesgo spam = ϕ; spam.add("eggs").
drdaeman

3
si ϕes un conjunto congelado, entonces spam.add("eggs")falla, porque el objeto congelado no tiene ningún addmétodo.
Brian Minton

1
@BrianMinton: Pero ese es el comportamiento previsto. Tenga en cuenta que cuando alguien escribe span = ϕambos spany ϕseñalará el mismo objeto, es decir id(span) == id(ϕ). Por lo tanto, si spam.add("eggs")funcionara, el ϕobjeto ya no sería un conjunto vacío, y volveremos al problema original como lo señaló drdaeman
Renato García

1
@RenatoGarcia Compare con el literal vacío dict:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

Si. La misma notación que funciona para dict / set no vacío funciona para los vacíos.

Observe la diferencia entre no vacíos dicty setliterales:

{1: 'a', 2: 'b', 3: 'c'}- un número de pares clave-valor en el interior hace un dict
{'aaa', 'bbb', 'ccc'}- una tupla de valores en el interior hace unset

Entonces:

{}== número cero de pares clave-valor == vacío dict
{*()}== vacío tupla de valores == vacíoset

Sin embargo, el hecho de que puedas hacerlo no significa que debas hacerlo. A menos que tenga algunas razones sólidas, es mejor construir un conjunto vacío explícitamente, como:

a = set()

NB : como ctrueden notó en los comentarios, no{()} es un conjunto vacío. Es un conjunto con 1 elemento: tupla vacía.


2
{()}No es el conjunto vacío. Es un conjunto singleton con un elemento: una tupla vacía. Puede verificar esto marcando len({()})cuál será 1 o () in {()}cuál será True.
ctrueden

1
¡Vaya, tienes razón! Actualicé la publicación: agregué la nota sobre {()}no ser un conjunto vacío, en caso de que alguien cometa el mismo error. ¡Gracias, @ctrueden!
pycoder

-1

Hay pocas formas de crear un conjunto vacío en Python:

  1. Uso del método set ()
    Este es el método incorporado en python que crea un conjunto vacío en esa variable.
  2. Usando el método clear () (Creative Engineer Technique LOL)
    Vea este ejemplo:

    sets = {"Hi", "How", "are", "You", "All"}
    type (sets) (This Line Output: set)
    sets .clear ()
    print (sets) (This Line Output: {})
    type (sets) (This Line Output: set)

Entonces, estas son 2 formas de crear un conjunto vacío.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.