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, úseloset() 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)
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 setif a==set():#do something#length-checking comparisonif len(a)==0:#do something
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.
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.
{()}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:
Uso del método set ()
Este es el método incorporado en python que crea un conjunto vacío en esa variable.
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.
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.{0}-{0}
. No es tan claro comoset()
, pero tiene la ventaja de parecer un par de ojos divertidos.{}
es un diccionario.{0}
es un conjunto.{0} - {0}
es la diferencia entre un conjunto y sí mismo, que es el conjunto vacío.Respuestas:
No, no hay sintaxis literal para el conjunto vacío. Tienes que escribir
set()
.fuente
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:esta es básicamente una forma más condensada de hacer
{_ for _ in ()}
, pero no hagas esto.fuente
$ 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
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.Solo para extender la respuesta aceptada:
Desde la versión
2.7
y3.1
Python tieneset
literal{}
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)
Python 3.x
Más aquí: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
fuente
{}.__class__
todavía daríadict
{}.__class__
regresa<class 'dict'>'
con pyt3.6, no<type 'dict'>
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, useset()
o verifique si la longitud es 0.ejemplo:
fuente
a=set()
no vacía el conjunto , pero crea un nuevo conjunto y lo asignaa
, sobrescribiendo cualquier valor anterior.a.clear()
método es ligeramente más rápido quea=set()
, comprobación ylen(a)==0
es ligeramente más rápido que la comprobación de la igualdad dea==set()
if len(a)==0:
es suficiente (y es más pitónico) escribir soloif a:
(editar: o más bien,if not a:
para que coincida con la polaridad de la condición).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.fuente
set
objetos son mutables, por lo que te estás poniendo en riesgospam = ϕ; spam.add("eggs")
.ϕ
es un conjunto congelado, entoncesspam.add("eggs")
falla, porque el objeto congelado no tiene ningúnadd
método.span = ϕ
ambosspan
yϕ
señalará el mismo objeto, es decirid(span) == id(ϕ)
. Por lo tanto, sispam.add("eggs")
funcionara, elϕ
objeto ya no sería un conjunto vacío, y volveremos al problema original como lo señaló drdaeman>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
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
dict
yset
literales:{1: 'a', 2: 'b', 3: 'c'}
- un número de pares clave-valor en el interior hace undict
{'aaa', 'bbb', 'ccc'}
- una tupla de valores en el interior hace unset
Entonces:
{}
== número cero de pares clave-valor == vacíodict
{*()}
== 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:
NB : como ctrueden notó en los comentarios, no
{()}
es un conjunto vacío. Es un conjunto con 1 elemento: tupla vacía.fuente
{()}
No es el conjunto vacío. Es un conjunto singleton con un elemento: una tupla vacía. Puede verificar esto marcandolen({()})
cuál será 1 o() in {()}
cuál seráTrue
.{()}
no ser un conjunto vacío, en caso de que alguien cometa el mismo error. ¡Gracias, @ctrueden!Hay pocas formas de crear un conjunto vacío en Python:
Este es el método incorporado en python que crea un conjunto vacío en esa variable.
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.
fuente