¿Conjunto vacío literal?

Resuelto Johan Råde asked hace 13 años • 7 respuestas

[]= vacíolist

()= vacíotuple

{}= vacíodict

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

Johan Råde avatar May 26 '11 03:05 Johan Råde
Aceptado

No, no existe una sintaxis literal para el conjunto vacío. Tu tienes que escribir set().

sepp2k avatar May 25 '2011 20:05 sepp2k

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.7y 3.1Python tiene una forma de uso setliteral , 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

Reishin avatar Jun 26 '2015 12:06 Reishin

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 dicty setliterales:

{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.

pycoder avatar Oct 17 '2019 22:10 pycoder