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

set() vs {...}

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

Beitragvon Leonidas » 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.

Beitragvon b.esser-wisser » 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

Re: set() vs {...}

Beitragvon Darii » 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

Beitragvon mzh » 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

Beitragvon 10111 » 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

Beitragvon helduel » 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: 2423
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » 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

Beitragvon 10111 » 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

Beitragvon 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

Beitragvon helduel » 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

Beitragvon 10111 » 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

Beitragvon numerix » 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

Beitragvon 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

Beitragvon birkenfeld » 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/

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder