python - ¿Por qué es posible reemplazar a veces set() con{}?
plot title python (4)
En PyCharm, cuando escribo:
return set([(sy + ady, sx + adx)])
dice "La llamada de función se puede reemplazar con set literal", por lo que se reemplaza con:
return {(sy + ady, sx + adx)}
¿Porqué es eso? ¿Un set()
en Python no es lo mismo que un diccionario {}
?
Y si quiere optimizar esto, ¿por qué es más efectivo?
Es una sintaxis alternativa para set()
>>> a = {1, 2}
>>> b = set()
>>> b.add(1)
>>> b.add(2)
>>> b
set([1, 2])
>>> a
set([1, 2])
>>> a == b
True
>>> type(a) == type(b)
True
dict
sintaxis de dict
es diferente. Se compone de pares clave-valor. Por ejemplo:
my_obj = {1:None, 2:None}
Los conjuntos y diccionarios de Python pueden construirse utilizando llaves:
my_dict = {''a'': 1, ''b'': 2}
my_set = {1, 2, 3}
El intérprete (y los lectores humanos) pueden distinguir entre ellos en función de sus contenidos. Sin embargo, no es posible distinguir entre un conjunto vacío y un dict vacío, por lo que, en este caso, debe usar set()
para que los conjuntos vacíos se desambiguen.
Una prueba muy simple sugiere que la construcción literal es más rápida (python3.5):
>>> timeit.timeit(''a = set([1, 2, 3])'')
0.5449375328607857
>>> timeit.timeit(''a = {1, 2, 3}'')
0.20525191631168127
Esta pregunta cubre algunos problemas de rendimiento de construcciones literales sobre funciones integradas, aunque para listas y dictados. El resumen parece ser que las construcciones literales requieren menos trabajo del intérprete.
Otro ejemplo de cómo set
y {}
no son intercambiables (como se mencionó jonrsharpe):
In: f = ''FH''
In: set(f)
Out: {''F'', ''H''}
In: {f}
Out: {''FH''}
set([iterable])
es el constructor para crear un set desde el iterable iterable
opcional. Y {}
es crear literales set / dict object. Entonces, lo que se crea depende de cómo lo uses.
In [414]: x = {}
In [415]: type(x)
Out[415]: dict
In [416]: x = {1}
In [417]: type(x)
Out[417]: set
In [418]: x = {1: "hello"}
In [419]: type(x)
Out[419]: dict