Seite 1 von 1

set() vs {...}

Verfasst: Mittwoch 4. März 2009, 09:58
von mzh
Hallo zusammen!

Ich arbeite mich gerade in Python ein (muss meine Masterarbeit damit durchführen...) und beschäftige mich gerade ein bisschen mit den Grundlagen der Sprache. Folgendes ist mir aufgefallen:

Code: Alles auswählen

 a = set(0)
funktioniert nicht. Aber

Code: Alles auswählen

 a = {0}

klappt ganz gut. Worin besteht nun der unterschied? Im Python-Tutorial werden diese beiden Konzepte ziemlich gleichwertig behandelt, bzw. der Unterschied für mich zuwenig deutlich gemacht. set(0) ist doch eigenlich ein Typecast, nicht?

Verfasst: Mittwoch 4. März 2009, 10:11
von Leonidas
Hallo mzh, willkommen im Forum,

Python hat keine Typecasts. Ich nehme an du nutzt Python 3, weil sonst würde {0} gar nicht funktionieren. Das Problem über das du stolperst ist, dass ``set()`` ein Iterable erwartet, auch wenn das Iterable nur ein Element haben soll, aus Konsistenzgründen. Somit muss der Aufruf ``set([0])`` lauten, wenn du willst dass es funktioniert.

Verfasst: Mittwoch 4. März 2009, 10:15
von b.esser-wisser
"set()" nimmt doch (wie "tuple", "list", etc.) ein "iterable" als Argument, d.h.

Code: Alles auswählen

set([1,-2e-99,"abc", u"Bäh", 7+6.88e3j)
set((0,))
geht.
"{...}" ist doch Python 3, oder? Das benutze ich (noch?) nicht, ich würde aber annehmen "{...}" funktioniert wie "[...]"
:arrow: Interpreter starten und ausprobieren ;)

hth, Jörg

Re: set() vs {...}

Verfasst: Mittwoch 4. März 2009, 10:23
von Darii
mzh hat geschrieben:Worin besteht nun der unterschied?
Das erste ist einfach ein Funktionsaufruf (in dem Fall der des Set-Constructors), das zweite ist ein Setliteral.

Verfasst: Mittwoch 4. März 2009, 10:32
von mzh
ja, ist python 3. Danke für die posts

Verfasst: Mittwoch 4. März 2009, 12:01
von 10111
Bin mir nicht sicher, aber in Python 3 dürfte sich das ja eigentlich nicht geändert haben: "{...}" erzeugt ein Dictonary. Also:

Code: Alles auswählen

d = {1: 'eins', 'b': 'Buchstabe'}
print d[1] # ergibt 'eins'
print d['b'] # ergibt 'Buchstabe'
Sets werden benutzt, wenn man mit Mengen zu tun hat. Also:

Code: Alles auswählen

a = set([1, 2, 3, 4])
b = set([3, 4, 5, 6])
s = a & b # Schnittmenge
erzeugt zwei Mengen und bestimmt dann die Schnittmenge, also "set([3, 4])".

Verfasst: Mittwoch 4. März 2009, 12:29
von helduel
10111 hat geschrieben:Bin mir nicht sicher, aber in Python 3 dürfte sich das ja eigentlich nicht geändert haben: "{...}" erzeugt ein Dictonary.
Hast schon recht, aber Python 3 kann etwas mehr:

Code: Alles auswählen

>>> d = {}
>>> type(d)
<class 'dict'>
>>> s = {0}
>>> type(s)
<class 'set'>
Gruß,
Manuel

Verfasst: Mittwoch 4. März 2009, 13:38
von DasIch
10111 hat geschrieben:Bin mir nicht sicher, aber in Python 3 dürfte sich das ja eigentlich nicht geändert haben:[...]
Da liegst du falsch mit Python 3 hat sich einiges verändert.

Verfasst: Mittwoch 4. März 2009, 13:40
von 10111
Hab mir grad mal Python 3 installiert. Das mit den Sets ist da ja viel einfacher. Also um mein Beispiel mit der Schnittmenge zu nehmen:

Code: Alles auswählen

>>> a = {1, 2, 3, 4}
>>> b = {3, 4, 5, 6}
>>> a & b
{3, 4}

Verfasst: Mittwoch 4. März 2009, 14:24
von BlackJack
Naja, ob man das nun als viel einfacher bezeichnen kann. Also ich finde das `set`-Literal hätte man sich sparen können.

Verfasst: Mittwoch 4. März 2009, 14:34
von helduel
BlackJack hat geschrieben:Naja, ob man das nun als viel einfacher bezeichnen kann. Also ich finde das `set`-Literal hätte man sich sparen können.
Finde ich auch. Außer man hätte ein leeres Dict als {:} definiert. So verwirrt es eher, das {1, 2, 3} ein mit Werten befülltes Set liefert, {} aber kein leeres :? .

Verfasst: Mittwoch 4. März 2009, 15:14
von 10111
@helduel: Dein Vorschlag ist logisch. Sehe das genau so. Ein Glück, dass die alte Variante noch funktioniert.

Verfasst: Mittwoch 4. März 2009, 15:17
von numerix
BlackJack hat geschrieben:Naja, ob man das nun als viel einfacher bezeichnen kann. Also ich finde das `set`-Literal hätte man sich sparen können.
Mindestens, wenn nicht sogar "müssen". Gäbe es nicht die schon vorhandene dict-Syntax, wäre das eine prima Sache, aber so wird es dazu führen, dass z.B. hier im Forum mit dem weiteren Einzug von Python 3 immer mehr Anfragen von Einsteigern kommen, weil Code aus Gründen, die damit zusammenhängen, nicht läuft.

Verfasst: Mittwoch 4. März 2009, 17:13
von lunar
BlackJack hat geschrieben:Naja, ob man das nun als viel einfacher bezeichnen kann. Also ich finde das `set`-Literal hätte man sich sparen können.
Ein Literal für Mengen ist schon sinnvoll, die Umsetzung halt weniger ...

Verfasst: Mittwoch 4. März 2009, 21:43
von birkenfeld
Nur die Ruhe... mit {} als leerem Set wären die anderen 50% unzufrieden.

Alle, die hier ganz genau wissen, wie man eine Sprache designt, sollten mal längere Zeit python-dev lesen.