set() vs {...}

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Mittwoch 4. März 2009, 09:58

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?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 4. März 2009, 10:11

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Mittwoch 4. März 2009, 10:15

"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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Mittwoch 4. März 2009, 10:23

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.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Mittwoch 4. März 2009, 10:32

ja, ist python 3. Danke für die posts
10111
User
Beiträge: 22
Registriert: Samstag 21. Februar 2009, 01:34

Mittwoch 4. März 2009, 12:01

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])".
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 4. März 2009, 12:29

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
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 4. März 2009, 13:38

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.
10111
User
Beiträge: 22
Registriert: Samstag 21. Februar 2009, 01:34

Mittwoch 4. März 2009, 13:40

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}
BlackJack

Mittwoch 4. März 2009, 14:24

Naja, ob man das nun als viel einfacher bezeichnen kann. Also ich finde das `set`-Literal hätte man sich sparen können.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 4. März 2009, 14:34

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 :? .
10111
User
Beiträge: 22
Registriert: Samstag 21. Februar 2009, 01:34

Mittwoch 4. März 2009, 15:14

@helduel: Dein Vorschlag ist logisch. Sehe das genau so. Ein Glück, dass die alte Variante noch funktioniert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 4. März 2009, 15:17

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.
lunar

Mittwoch 4. März 2009, 17:13

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 ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 4. März 2009, 21:43

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten