¿Conjunto vacío literal?
[]
= vacíolist
()
= vacíotuple
{}
= vacíodict
¿Existe una notación similar para un vacío set
? ¿O tengo que escribir set()
?
No, no existe una sintaxis literal para el conjunto vacío. Tu tienes que escribir set()
.
Por supuesto, utilícelo set()
para crear un conjunto vacío.
Pero, si quieres impresionar a la gente, diles que puedes crear un conjunto vacío usando literales y *
con Python >= 3.5 ( ver PEP 448 ) haciendo:
>>> s = {*()} # or {*{}} or {*[]}
>>> print(s)
set()
Esta es básicamente una forma más condensada de hacerlo {_ for _ in ()}
, pero no hagas esto.
Solo para ampliar la respuesta aceptada:
De la versión 2.7
y 3.1
Python tiene una forma de uso set
literal , pero todavía se usa para dict vacío.{}
{1,2,3}
{}
Python 2.7 (la primera línea no es válida en Python <2.7)
>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>
Pitón 3.x
>>> {1,2,3}.__class__
<class 'set'>
>>> {}.__class__
<class 'dict'>
Más aquí: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
Sí. La misma notación que funciona para dict/set no vacíos funciona para los vacíos.
Observe la diferencia entre no vacíos dict
y set
literales:
{1: 'a', 2: 'b', 3: 'c'}
-- un número de pares clave-valor en su interior forma un dict
{'aaa', 'bbb', 'ccc'}
-- un número de valores en su interior forma unset
Entonces:
{}
== cero número de pares clave-valor == vacío dict
{*()}
== tupla vacía de valores == vacíoset
Sin embargo, el hecho de que puedas hacerlo no significa que debas hacerlo. A menos que tenga algunas razones de peso, es mejor construir un conjunto vacío explícitamente, como:
a = set()
Actuación:
El literal es ~15% más rápido que el constructor establecido (CPython-3.8, PC 2019, CPU Intel(R) Core(TM) i7-8550U a 1,80 GHz:
>>> %timeit ({*()} & {*()}) | {*()} 214 ns ± 1.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) >>> %timeit (set() & set()) | set() 252 ns ± 0.566 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
... y para completar, ¡ la propuesta de Renato García sobre la expresión anterior es aproximadamente un 60% más rápida !
frozenset
>>> ϕ = frozenset() >>> %timeit (ϕ & ϕ) | ϕ 100 ns ± 0.51 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
NB : Como notó ctrueden en los comentarios, no{()}
es un conjunto vacío. Es un conjunto con 1 elemento: tupla vacía.