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().
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 Sieset() 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.
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)
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.
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 setif a==set():#do something#length-checking comparisonif len(a)==0:#do something
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.
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.
{()}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:
Verwenden der set () -Methode
Dies ist die in Python integrierte Methode, mit der in dieser Variablen ein leerer Satz erstellt wird.
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.
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.{0}-{0}
. Es ist nicht so klar wieset()
, aber es hat den Vorteil, wie ein lustiges Paar Augen auszusehen.{}
ist ein Wörterbuch.{0}
Ist ein Satz.{0} - {0}
ist der Unterschied zwischen einer Menge und sich selbst, die die leere Menge ist.Antworten:
Nein, es gibt keine wörtliche Syntax für die leere Menge. Du musst schreiben
set()
.quelle
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:Dies ist im Grunde eine komprimiertere Vorgehensweise
{_ for _ in ()}
, aber tun Sie dies nicht.quelle
$ 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
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".Nur um die akzeptierte Antwort zu erweitern:
Von Version
2.7
und3.1
Python hatset
Literal{}
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)
Python 3.x.
Mehr hier: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
quelle
{}.__class__
würde noch gebendict
{}.__class__
kehrt tatsächlich<class 'dict'>'
mit pyt3.6 zurück, nicht<type 'dict'>
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 Sieset()
oder überprüfen Sie, ob die Länge 0 ist.Beispiel:
quelle
a=set()
nicht der Satz leer , sondern erstellt einen neuen Satz an und ordnet siea
, vorherige werden überschrieben.a.clear()
Methode etwas schneller ist alsa=set()
und die Überprüfunglen(a)==0
etwas schneller ist als die Überprüfung auf Gleichheit mita==set()
if len(a)==0:
reicht es aus (und ist eher pythonisch), nur zu schreibenif a:
(bearbeiten: oder besser gesagt,if not a:
um der Polarität der Bedingung zu entsprechen).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.quelle
set
Objekte veränderlich sind, sodass Sie sich selbst einem Risiko aussetzenspam = ϕ; spam.add("eggs")
.ϕ
es sich um ein Frozenset handelt,spam.add("eggs")
schlägt dies fehl, da das Frozenset-Objekt keineadd
Methode hat.span = ϕ
beide schreibtspan
undϕ
auf dasselbe Objekt zeigt, did(span) == id(ϕ)
. H. Wennspam.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>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
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
dict
undset
Literalen:{1: 'a', 2: 'b', 3: 'c'}
- Eine Anzahl von Schlüssel-Wert-Paaren im Inneren ergibt adict
{'aaa', 'bbb', 'ccc'}
- Ein Tupel von Werten im Inneren ergibt aset
Damit:
{}
== Null Anzahl von Schlüssel-Wert-Paaren == leerdict
{*()}
== 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:
NB : Wie ctrueden in den Kommentaren bemerkt hat ,
{()}
ist nicht eine leere Menge. Es ist eine Menge mit 1 Element: leeres Tupel.quelle
{()}
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 wirdTrue
.{()}
nicht um ein leeres Set handelt, falls jemand anderes den gleichen Fehler macht. Vielen Dank, @ctrueden!Es gibt nur wenige Möglichkeiten, ein leeres Set in Python zu erstellen:
Dies ist die in Python integrierte Methode, mit der in dieser Variablen ein leerer Satz erstellt wird.
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.
quelle