2016-04-17 12 views
19

In PyCharm, quando scrivo:Perché è possibile sostituire set() con {}?

return set([(sy + ady, sx + adx)]) 

si dice "chiamata di funzione può essere sostituito con set letterale" quindi sostituisce con:

return {(sy + ady, sx + adx)} 

Perché? Un set() in Python non è lo stesso di un dizionario {}?

E se vuole ottimizzare questo, perché è più efficace?

+2

Si noti che, nonostante il titolo, è possibile ** non ** sostituire 'set()' con '' {}, ma si * può * sostituire un non vuoto 'set ((1, 2, 3)) 'con un letterale' {1, 2, 3} ', perché ora è chiaro che non è un dizionario. Vedere https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset – jonrsharpe

risposta

31

set Python e dizionari possono essere entrambi costruiti utilizzando le parentesi graffe:

my_dict = {'a': 1, 'b': 2}

my_set = {1, 2, 3}

L'interprete (e lettori umani) in grado di distinguere tra di loro in base alla loro contenuto. Tuttavia non è possibile distinguere tra un set vuoto e un dict vuoto, quindi in questo caso è necessario utilizzare set() per i set vuoti in cui disambiguare.

Un test molto semplice suggerisce che la costruzione letterale è più veloce (python3.5):

>>> timeit.timeit('a = set([1, 2, 3])') 
0.5449375328607857 
>>> timeit.timeit('a = {1, 2, 3}') 
0.20525191631168127 

This question copre alcuni problemi di prestazioni delle costruzioni letterali oltre funzioni interne, anche se per liste e dicts. Il riassunto sembra essere che le costruzioni letterali richiedono meno lavoro dall'interprete.

+0

La costruzione letterale è probabilmente più veloce perché non si crea una lista intermedia; e se lo calcolassi? – jonrsharpe

+1

@jonrsharpe sembra ancora più lento: 'timeit.timeit (stmt = 'a = set (mylist)', setup = 'mylist = [1, 2, 3]') -> 0.3987466390244663' - Penso che il link che ho aggiunto copra alcuni di questo. – snakecharmerb

+0

Bello, grazie per il controllo. – jonrsharpe

4

È una sintassi alternativa a 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 sintassi è diversa. Consiste di coppie chiave-valore. Per esempio:

my_obj = {1:None, 2:None} 
1

set([iterable]) è il costruttore per creare un set dall'iter iterabile iterable. E {} consiste nel creare letterali oggetti set/dict. Quindi ciò che viene creato dipende da come lo si usa.

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 
Problemi correlati