Usa le parentesi graffe per inizializzare un Set in Python


98

Sto imparando Python e ho una domanda per principianti sull'inizializzazione dei set. Attraverso i test, ho scoperto che un set può essere inizializzato in questo modo:

my_set = {'foo', 'bar', 'baz'}

Ci sono degli svantaggi nel farlo in questo modo, rispetto al modo standard di:

my_set = set(['foo', 'bar', 'baz'])

o è solo una questione di stile?


2
La documentazione lo menziona, ma non c'è. Nota che questa è la documentazione per un modulo deprecato, i set reali ora sono incorporati. Si trova nel documento "Novità di Python 2.7" e il riferimento al linguaggio lo descrive brevemente: docs.python.org/2/reference/expressions.html#set-displays

@delnan Uso python 2.7, quindi non ho pensato di guardare nei documenti di python 3. Il link che ho postato è per 2.7, ma stranamente non lo menziona.
fvrghl

1
Da quando ho modificato il mio commento, anche i documenti 2.7 lo menzionano. Il link che hai postato è obsoleto, una reliquia del passato, sbagliato, deprecato. Dimentica che esiste e usa quello che ti dice di usare invece: docs.python.org/2/library/stdtypes.html#set e docs.python.org/2/library/stdtypes.html#frozenset

@delnan Grazie per avermi aiutato. Ho modificato la domanda in modo che non dica più che non c'è documentazione (sebbene ci siano pochi esempi che lo menzionano online).
fvrghl

Per i passanti: Pycharm avverte di non utilizzare una chiamata di funzione quando si può usare un valore letterale - potrebbero esserci ragioni di prestazioni - quindi preferisci il modo letterale impostato nel nuovo codice
Mr_and_Mrs_D

Risposte:


102

Ci sono due ovvi problemi con la sintassi set literal:

my_set = {'foo', 'bar', 'baz'}
  1. Non è disponibile prima di Python 2.7

  2. Non c'è modo di esprimere un set vuoto usando quella sintassi (usando {}crea un dict vuoto)

Questi possono o non possono essere importanti per te.

La sezione dei documenti che delinea questa sintassi è qui .


46

Confronta anche la differenza tra {}e set()con un singolo argomento di parola.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

ma entrambi ae bsono insiemi ovviamente.


4
ecco perché mi piace ricordare a me stesso il costruttore di set come set([])piuttosto che semplicemente set().
Michael Ekoka

3
set()prendi sempre un solo argomento. Un unico iterabile.
George Kettleborough,

1
@GeorgeKettleborough uno o nessun argomento, quest'ultimo per creare un insieme vuoto.
gertvdijk

28

Dalla documentazione di Python 3 ( lo stesso vale per Python 2.7 ):

Le parentesi graffe o la funzione set () possono essere utilizzate per creare set. Nota: per creare un set vuoto devi usare set (), non {}; quest'ultimo crea un dizionario vuoto, una struttura dati che discuteremo nella prossima sezione.

in Python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

Tieni presente che {}viene utilizzato anche per map/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

Si può anche usare una sintassi completa per inizializzare i set:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])

1

È necessario empty_set = set()inizializzare un set vuoto. {}è dizione vuota.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.