Leerer Satz wörtlich?

460

[] = leer list

() = leer tuple

{} = leer dict

Gibt es eine ähnliche Notation für eine leere set? Oder muss ich schreiben set()?

Johan Råde
quelle
12
du akzeptierst {i für i in []} nicht, oder?
utdemir
3
Ich möchte nur zeigen, dass mit Python fast alles möglich ist. Wenn Sie einen Satz erstellen möchten, ohne to (() zu verwenden, können Sie dies tun.
utdemir
6
Ja, Sie können so ziemlich alles auf hundert verschiedene Arten tun. Ich füge map(lambda x: x)meinen Codebeispielen nicht nur hinzu, um Ihnen zu zeigen, dass es auch funktioniert. Es ist auch kein festgelegtes Literal, es ist nur ein festgelegtes Verständnis.
130
Ein dummer Weg, der funktionieren würde {0}-{0}. Es ist nicht so klar wie set(), aber es hat den Vorteil, wie ein lustiges Paar Augen auszusehen.
wim
10
@ Chris {}ist ein Wörterbuch. {0}Ist ein Satz. {0} - {0}ist der Unterschied zwischen einer Menge und sich selbst, die die leere Menge ist.
michaelsnowden

Antworten:

520

Nein, es gibt keine wörtliche Syntax für die leere Menge. Du musst schreiben set().

sepp2k
quelle
Sie meinen, es gibt keine wörtliche Syntax für die leere Menge? Oder für Sets im Allgemeinen?
Johan Råde
15
Es gibt festgelegte Literale, jedoch nur in Python 3.x. Es gibt kein Literal für leere Mengen.
2
@ user763305: Das Sprachhandbuch ist in diesem Punkt ziemlich klar. docs.python.org/library/stdtypes.html#set-types-set-frozenset sagt, dass "nicht leere Mengen ... erstellt werden können, indem eine durch Kommas getrennte Liste von Elementen in geschweifte Klammern gesetzt wird"
S.Lott
43
Tatsächlich wurden Set-Literale auf Python 2.7
zurückportiert
13
@andy Das ist keine leere Menge - das ist eine Menge, die die Nummer 1 enthält. Sie brauchen übrigens kein nachfolgendes Komma - das ist nur für Tupel erforderlich.
sepp2k
53

Verwenden Sie set() auf jeden Fall, um ein leeres Set zu erstellen.

Wenn Sie jedoch Menschen beeindrucken möchten, teilen Sie ihnen mit, dass Sie eine leere Menge mit Literalen und *mit Python> = 3.5 ( siehe PEP 448 ) erstellen können, indem Sie Folgendes tun:

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

Dies ist im Grunde eine komprimiertere Vorgehensweise {_ for _ in ()}, aber tun Sie dies nicht.

Dimitris Fasarakis Hilliard
quelle
Warum?! Leistung ist fast identisch:$ 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()ist wahrscheinlich viel einfacher zu verstehen (für Code-Betreuer), und das ist oft wichtiger als die Leistung. {*()}scheint in einem fast abwertenden Sinne "klug".
Benjamin
Heh, das ist klug.
Kowalski
46

Nur um die akzeptierte Antwort zu erweitern:

Von Version 2.7und 3.1Python hat setLiteral {}in Form der Verwendung {1,2,3}, aber {}selbst immer noch für leere Diktate verwendet.

Python 2.7 (erste Zeile ist in Python <2.7 ungültig)

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

Python 3.x.

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

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

Reishin
quelle
12
Diese Antwort ist falsch. Es gibt noch keine Literal-Syntax, um eine leere Menge darzustellen. {}.__class__würde noch gebendict
Ninja420
8
@ Ninja420 versuchen, zuerst vor dem Kommentar zu lesen, ich habe bemerkt, dass
Reishin
3
Die akzeptierte Antwort ist immer noch korrekt und nicht veraltet. Es gibt keine Literal-Syntax für die leere Menge , es gibt jedoch eine für das leere Wörterbuch.
AndreasHassing
2
@ AndreasBjørn für ein leeres Ja, für nicht leer erhalten Sie jedoch eine PEP8-Ausnahme und einen Vorschlag zur Verwendung des Set-Literal.
Reishin
{}.__class__kehrt tatsächlich <class 'dict'>'mit pyt3.6 zurück, nicht<type 'dict'>
klew
6

Dies hängt davon ab, ob Sie das Literal für einen Vergleich oder für eine Zuweisung verwenden möchten.

Wenn Sie einen vorhandenen Satz leer machen möchten, können Sie die .clear()Metod verwenden, insbesondere wenn Sie das Erstellen eines neuen Objekts vermeiden möchten. Wenn Sie einen Vergleich durchführen möchten, verwenden Sie set()oder überprüfen Sie, ob die Länge 0 ist.

Beispiel:

#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
Brian Minton
quelle
8
a=set()nicht der Satz leer , sondern erstellt einen neuen Satz an und ordnet sie a, vorherige werden überschrieben.
Gerrit
Tatsächlich. Deshalb habe ich gesagt, wenn Sie vermeiden möchten, ein neues Objekt zu erstellen, sollten Sie clear () verwenden. Ich nehme an, mein Kommentar hätte etwas anders formuliert sein sollen.
Brian Minton
Es scheint auch, dass die Verwendung der a.clear()Methode etwas schneller ist als a=set()und die Überprüfung len(a)==0etwas schneller ist als die Überprüfung auf Gleichheit mita==set()
Brian Minton
3
Stattdessen if len(a)==0:reicht es aus (und ist eher pythonisch), nur zu schreiben if a: (bearbeiten: oder besser gesagt, if not a:um der Polarität der Bedingung zu entsprechen).
Jim Oldfield
2

Hinzufügen zu den verrückten Ideen: Wenn Python 3 Unicode-Bezeichner akzeptiert, können Sie eine Variable deklarieren ϕ = frozenset()(ϕ ist U + 03D5) und stattdessen verwenden.

Renato Garcia
quelle
4
Das Problem ist, dass setObjekte veränderlich sind, sodass Sie sich selbst einem Risiko aussetzen spam = ϕ; spam.add("eggs").
Drdaeman
3
Wenn ϕes sich um ein Frozenset handelt, spam.add("eggs")schlägt dies fehl, da das Frozenset-Objekt keine addMethode hat.
Brian Minton
1
@ BrianMinton: Aber das ist das beabsichtigte Verhalten. Beachten Sie, dass, wenn jemand span = ϕbeide schreibt spanund ϕauf dasselbe Objekt zeigt, d id(span) == id(ϕ). H. Wenn spam.add("eggs")es funktionieren würde, wäre das ϕObjekt keine leere Menge mehr, und wir werden auf das ursprüngliche Problem zurückkommen, auf das drdaeman
Renato Garcia
1
@ RenatoGarcia Vergleichen Sie mit dem leeren Diktal wörtlich:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton
1

Ja. Die gleiche Notation, die für nicht leere Diktate / Sätze funktioniert, gilt auch für leere.

Beachten Sie den Unterschied zwischen nicht leer dictund setLiteralen:

{1: 'a', 2: 'b', 3: 'c'}- Eine Anzahl von Schlüssel-Wert-Paaren im Inneren ergibt a dict
{'aaa', 'bbb', 'ccc'}- Ein Tupel von Werten im Inneren ergibt aset

Damit:

{}== Null Anzahl von Schlüssel-Wert-Paaren == leer dict
{*()}== leeres Tupel von Werten == leerset

Die Tatsache, dass Sie es tun können, bedeutet jedoch nicht, dass Sie es tun sollten. Wenn Sie keine triftigen Gründe haben, ist es besser, eine leere Menge explizit zu erstellen, wie:

a = set()

NB : Wie ctrueden in den Kommentaren bemerkt hat , {()}ist nicht eine leere Menge. Es ist eine Menge mit 1 Element: leeres Tupel.

Pycoder
quelle
2
{()}ist nicht die leere Menge. Es ist eine Singleton-Menge mit einem Element: einem leeren Tupel. Sie können dies überprüfen, indem Sie überprüfen, len({()})welche 1 oder () in {()}welche sein wird True.
ctrueden
1
Ups, du hast recht! Ich habe den Beitrag aktualisiert: Es wurde der Hinweis hinzugefügt, dass es sich {()}nicht um ein leeres Set handelt, falls jemand anderes den gleichen Fehler macht. Vielen Dank, @ctrueden!
Pycoder
-1

Es gibt nur wenige Möglichkeiten, ein leeres Set in Python zu erstellen:

  1. Verwenden der set () -Methode
    Dies ist die in Python integrierte Methode, mit der in dieser Variablen ein leerer Satz erstellt wird.
  2. Verwenden der clear () -Methode (Creative Engineer Technique LOL)
    Siehe dieses Beispiel:

    sets = {"Hi", "How", "are", "You", "All"}
    set (sets) (This Line Output: set)
    sets .clear ()
    print (Sätze) (Diese Zeilenausgabe : {})
    Typ (Sätze) (Diese Zeilenausgabe: Satz)

Dies sind also zwei Möglichkeiten, um ein leeres Set zu erstellen.

Treffen Sie Shah
quelle