Vuoto set letterale?


461

[] = vuoto list

() = vuoto tuple

{} = vuoto dict

Esiste una notazione simile per un vuoto set? O devo scrivere set()?


12
non accetti {i for i in []}, vero?
utdemir,

3
Voglio solo mostrare quasi tutto ciò che è possibile con Python. Se si desidera creare un set senza usare set (), è possibile.
utdemir,

6
Sì, puoi fare praticamente tutto in cento modi convulsi. Non aggiungo map(lambda x: x)ai miei esempi di codice solo per mostrarti che funziona anche. Non è anche un set letterale, è solo una comprensione set.

130
Un modo stupido che funziona sarebbe {0}-{0}. Non è così chiaro come set(), ma ha il vantaggio di sembrare un paio di occhi divertenti.
mercoledì

10
@Chris {}è un dizionario. {0}è un set. {0} - {0}è la differenza tra un set e se stesso, che è l'insieme vuoto.
michaelsnowden,

Risposte:


519

No, non esiste una sintassi letterale per l'insieme vuoto. Si deve scrivere set().


Vuoi dire che non esiste una sintassi letterale per l'insieme vuoto? O per i set in generale?
Johan Råde,

15
Ci sono letterali impostati, ma solo in Python 3.x. Non esiste un valore letterale per i set vuoti in entrambi i modi.

2
@ user763305: il manuale della lingua è abbastanza chiaro su questo punto. docs.python.org/library/stdtypes.html#set-types-set-frozenset afferma che "gli insiemi non vuoti ... possono essere creati posizionando un elenco separato da virgole di elementi tra parentesi graffe"
S.Lott

44
In realtà, i set letterali sono stati riportati in Python 2.7, quindi non sono disponibili solo rigorosamente in Python 3.
Jim Brissom,

13
@andy Questo non è un set vuoto - è un set contenente il numero 1. A proposito, non è necessaria la virgola finale - è richiesto solo per le tuple.
sepp2k,

54

Si prega di utilizzare set() per creare un set vuoto.

Ma, se vuoi stupire le persone, digli che puoi creare un set vuoto usando valori letterali e *con Python> = 3.5 ( vedi PEP 448 ) facendo:

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()

questo è fondamentalmente un modo di fare più condensato {_ for _ in ()}, ma non farlo.


Perché?! Le prestazioni sono quasi identiche:$ python3.7 -m timeit 'set()' 2000000 loops, best of 5: 177 nsec per loop $ python3.7 -m timeit '{*()}' 2000000 loops, best of 5: 171 nsec per loop
Ogurets

9
@ogurets, set()è probabilmente molto più facile da capire (per i manutentori del codice), e questo spesso conta più delle prestazioni. {*()}sembra "intelligente" in senso quasi peggiorativo.
Benjimin,

Heh, è ​​intelligente.
Kowalski

46

Solo per estendere la risposta accettata:

Dalla versione 2.7e 3.1Python ha setletteralmente {}in forma di utilizzo {1,2,3}, ma a sua {}volta ancora usato per dict vuoto.

Python 2.7 (la prima riga non è valida in Python <2.7)

>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>

Python 3.x

>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>

Altro qui: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes


12
Questa risposta è sbagliata Non esiste ancora una sintassi letterale per rappresentare un set vuoto. {}.__class__darebbe ancoradict
Ninja420

8
@ Ninja420 prova a leggere prima di commentare, ho notato che
Reishin

3
La risposta accettata è ancora corretta e non è obsoleta. Non esiste una sintassi letterale per l'insieme vuoto , ce n'è comunque una per il dizionario vuoto.
AndreasHassing,

2
@ AndreasBjørn per un sì vuoto, tuttavia per il non vuoto otterrai l'eccezione PEP8 e il suggerimento di utilizzare set letterale.
Reishin,

in realtà, {}.__class__ritorna <class 'dict'>'con pyt3.6, non<type 'dict'>
klew

6

Dipende se si desidera il valore letterale per un confronto o per un compito.

Se si desidera svuotare un set esistente, è possibile utilizzare il .clear()metodo, soprattutto se si desidera evitare la creazione di un nuovo oggetto. Se vuoi fare un confronto, usaset() o controlla se la lunghezza è 0.

esempio:

#create a new set    
a=set([1,2,3,'foo','bar'])
#or, using a literal:
a={1,2,3,'foo','bar'}

#create an empty set
a=set()
#or, use the clear method
a.clear()

#comparison to a new blank set
if a==set():
    #do something

#length-checking comparison
if len(a)==0:
    #do something

8
a=set()non svuota il set , ma crea un nuovo set e lo assegna a, sovrascrivendo qualsiasi valore precedente.
Gerrit,

Infatti. Ecco perché ho detto che se vuoi evitare di creare un nuovo oggetto, dovresti usare clear (). Suppongo che il mio commento avrebbe dovuto essere formulato in modo leggermente diverso.
Brian Minton,

Sembra anche che usare il a.clear()metodo sia leggermente più veloce di a=set(), e il controllo len(a)==0è leggermente più veloce del controllo dell'uguaglianza aa==set()
Brian Minton

3
Invece if len(a)==0:è sufficiente (ed è più Pythonic) scrivere solo if a: (modifica: o meglio, if not a:per abbinare la polarità della condizione).
Jim Oldfield,

2

Aggiungendo alle idee folli: con Python 3 che accetta identificatori unicode, potresti dichiarare una variabile ϕ = frozenset()(ϕ è U + 03D5) e usarla invece.


4
Il problema è che gli setoggetti sono mutevoli, quindi ti stai mettendo a rischio spam = ϕ; spam.add("eggs").
drdaeman,

3
se ϕè un frozenset, allora spam.add("eggs")fallisce, perché l'oggetto frozenset non ha alcun addmetodo.
Brian Minton,

1
@BrianMinton: Ma questo è il comportamento previsto. Nota che quando qualcuno scrive span = ϕentrambi spane ϕpunterà allo stesso oggetto, ad es id(span) == id(ϕ). Quindi, se spam.add("eggs")funzionasse, l' ϕoggetto non sarebbe più un set vuoto e torneremo al problema originale come indicato dal drdaeman
Renato Garcia,

1
@RenatoGarcia Confronta con il letterale vuoto dict:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

Sì. La stessa notazione che funziona per dict / set non vuoti funziona per quelli vuoti.

Notare la differenza tra non vuoto dicte setletterali:

{1: 'a', 2: 'b', 3: 'c'}- un numero di coppie chiave-valore all'interno crea a dict
{'aaa', 'bbb', 'ccc'}- una tupla di valori all'interno crea aset

Così:

{}== zero numero di coppie chiave-valore == vuoto dict
{*()}== vuoto tupla di valori == vuotoset

Tuttavia, il fatto che tu possa farlo, non significa che dovresti. A meno che tu non abbia alcuni validi motivi, è meglio costruire esplicitamente un set vuoto, come:

a = set()

NB : Come notato da ctrueden nei commenti, non{()} è un set vuoto. È un set con 1 elemento: tupla vuota.


2
{()}non è l'insieme vuoto. È un insieme singleton con un elemento: una tupla vuota. Puoi verificarlo controllando len({()})quale sarà 1 o () in {()}quale sarà True.
ctrueden

1
Oops, hai ragione! Ho aggiornato il post: aggiunta la nota di {()}non essere un set vuoto, nel caso in cui qualcun altro commetta lo stesso errore. Grazie, @ctrueden!
pycoder

-1

Esistono alcuni modi per creare Set vuoti in Python:

  1. Uso del metodo set ()
    Questo è il metodo integrato in Python che crea un set vuoto in quella variabile.
  2. Uso del metodo clear () (tecnica ingegnere creativa LOL)
    Vedi questo esempio:

    sets = {"Ciao", "How", "are", "You", "All"}
    type (sets) (This Line Output: set)
    sets .clear ()
    print (sets) (This Line Output: {})
    type (sets) (This Line Output: set)

Quindi, ci sono 2 modi per creare un Set vuoto.

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.