Pregunta Diferencia entre dict y set (python)


Entonces, sé que esto,

a = {}  # dict

Construye un diccionario vacío. Ahora, también recogí eso,

b = {1, 2, 3}  # set

Crea un conjunto. Esto se puede verificar fácilmente, como

>>>print(type(a))
<class 'dict'>

>>>print(type(b))
<class 'set'>

Mientras entiendo lo que hace, no puedo ver por qué usamos la misma sintaxis para ambos conjuntos y diccionarios. Traté de encontrar más información sobre la lógica detrás de esto en el set y dict secciones del manual, pero lamentablemente, no obtuve nada de eso.

¿Alguien podría explicarme por qué hacemos esto de esta manera? ¿Es por razones históricas, o me estoy perdiendo algo descaradamente obvio?


25
2017-12-19 12:13


origen


Respuestas:


No hubo establecer literales en Python 2, llaves históricamente rizadas solo se usan para diccionarios. Los conjuntos pueden producirse a partir de listas (o cualquier iterable):

set([1, 2, 3])
set([i for i in range(1, 3)])

Python 3 introdujo los conjuntos de literales y comprensiones (ver PEP-3100) que permite evitar listas intermedias:

{1, 2, 3}
{i for i in range(1, 3)}

Vacío configurado, sin embargo, reservado para diccionarios como compatibilidad con versiones anteriores. Verifique las referencias de PEP-3100, es decir, aquí: [Python-3000] establece en P3K?

Estoy seguro de que podemos resolver algo --- Estoy de acuerdo, {} para el conjunto vacío y {:}   para dict vacío sería ideal, si no fuera por compatibilidad hacia atrás. yo   le gustó la idea del "objeto vacío especial" cuando escribí el PEP por primera vez (es decir,   tener {} ser algo que podría convertirse en un conjunto o dict), pero uno   de los instructores aquí me convencieron de que solo conduciría a la confusión   en las mentes de los recién llegados (además de ser un dolor de implementar).

los siguiente mensaje describe estas reglas mejor:

Creo que Guido tuvo la mejor solución. Utilizar set() para juegos vacíos, use {}    para dicts vacíos, use {genexp} para establecer comprensiones / visualizaciones, uso    {1,2,3} para literales establecidos explícitos, y uso {k1:v1, k2:v2} para dict   literales. Siempre podemos agregar {/} más tarde si la demanda excede el disgusto.


23
2017-12-19 12:25



La sintaxis es no lo mismo. Los diccionarios usaron llaves el primero y usted especifica valor clave pares, donde la clave y el valor están separados por dos puntos:

>>> {'foo': 'bar'}
{'foo': 'bar'}
>>> type(_)
<type 'dict'>

Los conjuntos se agregaron al idioma más adelante y el {..} nombres de la rotulación solo nombres elementos, no pares:

>>> {'foo'}
set(['foo'])
>>> type(_)
<type 'set'>

Tenga en cuenta que en Python 2, el intérprete repite el objeto utilizando el set() invocable Así es también como especificas un vacío conjunto:

>>> emptyset = set()

En Python 3, el más nuevo {..} la notación se usa cuando se hace eco del objeto, a menos que esté vacío:

>>> {'foo'}
{'foo'}
>>> _ - {'foo'}  # difference, removing the one element
set()

los set() tipo fue agregado al lenguaje Python en versión 2.4 (ver PEP 218), la sintaxis del parche rizado para los literales establecidos era agregado en Python 3 y retroportado a Python 2.7.


8
2017-12-19 12:16



El hecho de que {} se usa para un diccionario vacío y no para un conjunto vacío tiene razones en gran parte históricas. La sintaxis {'a': 100, 'b': 200} para los diccionarios ha existido desde el comienzo de Python. La sintaxis {1, 2, 3}para los conjuntos se introdujo con Python 2.7. Ya que {} se ha utilizado durante tanto tiempo que permanecerá como la forma de definir un diccionario vacío. Si Python hubiera tenido la sintaxis del nuevo conjunto desde el principio, probablemente se definiría un conjunto vacío con {} y un diccionario vacío con {:}.


6
2017-12-19 12:28