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.