set vs Sets Py 2.4
Hi,
was ich mich schon länger frage, wozu ist noch das Sets modul dabei,
die built-in set's können doch das gleiche, oder hab ich da was übersehen ?
Mal abgesehen davon das das modul Sets in python implementiert ist und wahrscheinlich langsamer ist als das built-in ....
was ich mich schon länger frage, wozu ist noch das Sets modul dabei,
die built-in set's können doch das gleiche, oder hab ich da was übersehen ?
Mal abgesehen davon das das modul Sets in python implementiert ist und wahrscheinlich langsamer ist als das built-in ....
kompatibilitaet.
die machen sich alle in die hosen, wenn von einer version auf die andere irgendwelcher python code nicht mehr geht. deswegen werden altlasten ueber ein paar versionen mitgeschleppt.
in ein paar versionen gibts auch das sets modul nicht mehr.
die machen sich alle in die hosen, wenn von einer version auf die andere irgendwelcher python code nicht mehr geht. deswegen werden altlasten ueber ein paar versionen mitgeschleppt.
in ein paar versionen gibts auch das sets modul nicht mehr.
...meh...
Jepp.
Das Set Modul bietet einmal ``Set``und ``ImmutableSet``. ImmutableSet ist nicht veränderlich:
http://docs.python.org/lib/set-objects.html
http://www.python.org/doc/current/tut/n ... 0000000000
FAZIT:
ImmutableSet ist Sinnlos ``sets.Set`` ist gleich ``set``. Von Daher, das Bulltin-``set`` nutzen und das Modul ``Sets`` ignorieren, das ehe irgendwann, wie cracki schon meinte, wegkommt.
lg
sape
EDIT: Link und Text korrigiert.
...Code: Alles auswählen
test = set([1,2,3]) for elem in dir(test): if not elem.startswith(('_','__')): print elem
Code: Alles auswählen
add clear copy difference difference_update discard intersection intersection_update issubset issuperset pop remove symmetric_difference symmetric_difference_update union update
...Code: Alles auswählen
import sets test = sets.Set([1,2,3]) for elem in dir(test): if not elem.startswith(('_','__')): print elem
Code: Alles auswählen
add clear copy difference difference_update discard intersection intersection_update issubset issuperset pop remove symmetric_difference symmetric_difference_update union union_update update
Das Set Modul bietet einmal ``Set``und ``ImmutableSet``. ImmutableSet ist nicht veränderlich:
Code: Alles auswählen
import sets
test = sets.ImmutableSet([1,2,3])
for elem in dir(test):
if not elem.startswith(('_','__')):
print elem
Code: Alles auswählen
copy
difference
intersection
issubset
issuperset
symmetric_difference
union
http://docs.python.org/lib/set-objects.html
http://www.python.org/doc/current/tut/n ... 0000000000
FAZIT:
ImmutableSet ist Sinnlos ``sets.Set`` ist gleich ``set``. Von Daher, das Bulltin-``set`` nutzen und das Modul ``Sets`` ignorieren, das ehe irgendwann, wie cracki schon meinte, wegkommt.
lg
sape
EDIT: Link und Text korrigiert.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nein. ``sets.Set`` wurde einfach von ``set`` obsolet gemacht, ``ImmutableSet`` wurde von ``frozenset`` obsolet gemacht. So einfach ist das.sape hat geschrieben:FAZIT:
ImmutableSet ist Sinnlos ``sets.Set`` ist gleich ``set``.
Man kann seinen Code aber auch Python 2.4 kompatibel machen:
Code: Alles auswählen
try:
set()
except NameError:
import sets
set = sets.Set
frozenset = sets.ImmutableSet
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
JeppNein. ``sets.Set`` wurde einfach von ``set`` obsolet gemacht,
Das wusste ich noch nicht. Jetzt wo ich mir aber zu ``frozenset`` den Text nochmal durchgelesen habe, erinnert das Verhalten doch stakt an ``ImmutableSet`` ^^``ImmutableSet`` wurde von ``frozenset`` obsolet gemacht
...
Wozu braucht man eigentlich eine Immutable Version von ``set`` Mir fällt da kein Szenario ein wo ich das jemals gebraucht habe Oder ist es ein wenig schneller als ``set``?. Weil dann könnte man das doch gebrauchen und das "Updaten" würde sich über ``tuple`` gestalten ^^ ->
Code: Alles auswählen
x = frozenset([1, 2, 3])
print x
x = frozenset(tuple(x) + tuple([1, 2, 3, 4]))
print x
Code: Alles auswählen
x = set([1, 2, 3])
x.update([1,2,3,4])
print x
lg
sape
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Frozenset hat den gleichen Sinn einem Set gegenüber wie ein Tupel gegenüber einer Liste.
Manchmal will man eben Mengen darstellen, die sich nicht ändern lassen sollen.
Manchmal will man eben Mengen darstellen, die sich nicht ändern lassen sollen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Naja, ganz so ist es nicht.Frozenset hat den gleichen Sinn einem Set gegenüber wie ein Tupel gegenüber einer Liste.
Mit ``+`` kann man mehrer ``tuple``s Zusammenfügen:
Code: Alles auswählen
x = tuple([1,2,3,4,5,6])
x += tuple(['a', 'b', 'c'])
print x
Mit ``frozenset`` ist so eine Kontatktion mit ``+`` nicht`möglich ohne den Umweg eines ``tuples``. Daher sehe ich den Sinn nicht. Der Konvert ins ``tuple`` Kostet auch Zeit.
Code: Alles auswählen
x = frozenset([1, 2, 3])
x = frozenset(tuple(x) + tuple([1, 2, 3, 4]))
Von daher, hinkt der Vergleich von dir, da ein ``tuple`` diesbezüglich doch mächtiger ist -> Es ist zwar immutable, aber man merkt es nicht wirklich als benutzer im Gegensatz zu ``frozenset``.Code: Alles auswählen
x = frozenset([1, 2, 3]) x = x + frozenset([1, 2, 3, 4])
Code: Alles auswählen
x = frozenset([1, 2, 3]) x += frozenset([1, 2, 3, 4])
Code: Alles auswählen
TypeError: unsupported operand type(s) for +=: 'frozenset' and 'frozenset'
Naja, dann ändert man das Objekt das vom Typ``set`` ist eben nicht. Bei "Konstanten" hat man sich ja auch darauf geeinigt das alles was groß geschrieben ist eine Konstanten ist und man die nicht ändert, obwohl es eigentlich keine Konstanten ist, da Python sowas nicht kennt. Daher ist das nicht wirklich ein Argument das für ``frozenset`` spricht.anchmal will man eben Mengen darstellen, die sich nicht ändern lassen sollen.
lg
EDIT: Korrektur.
Zuletzt geändert von sape am Samstag 6. Januar 2007, 15:42, insgesamt 1-mal geändert.
Vor allem könnte man mal eine Menge in einer Menge speichern oder in einem Dictionary als Schlüssel verwenden wollen. Dann braucht man das `frozenset()`.
Warum? Ist das mit einem ``set`` nicht möglich?BlackJack hat geschrieben:Vor allem könnte man mal eine Menge in einer Menge speichern oder in einem Dictionary als Schlüssel verwenden wollen. Dann braucht man das `frozenset()`.
Der gleiche Grund wie bei Listen:
Code: Alles auswählen
In [9]: a = set((1,2,3))
In [10]: { a: 'test' }
---------------------------------------------------------------------------
exceptions.TypeError Traceback (most recent call last)
/home/marc/<ipython console>
TypeError: set objects are unhashable
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ja, zu einem neuen Tupel (weil du += und nicht + verwendest). Geht mitsape hat geschrieben:Naja, ganz so ist es nicht.Frozenset hat den gleichen Sinn einem Set gegenüber wie ein Tupel gegenüber einer Liste.
Mit ``+`` kann man mehrer ``tuple``s Zusammenfügen:Code: Alles auswählen
x = tuple([1,2,3,4,5,6]) x += tuple(['a', 'b', 'c']) print x
Code: Alles auswählen
x = frozenset((1, 2))
x = x.union(frozenset((3, 4))
print x
Es besitzt keine __add__/__radd__ Methode: macht aber nur sinn wenn man zwei Frozensets zusammennehmen will. Und um solche Sets zu erstellen, braucht man sowieso erstmal eine Liste oder ein Tupel. Sets und Tupel zu addieren ist ja unlogisch.sape hat geschrieben:Von daher, hinkt der Vergleich von dir, da ein ``tuple`` diesbezüglich doch mächtiger ist -> Es ist zwar immutable, aber man merkt es nicht wirklich als benutzer im Gegensatz zu ``frozenset``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Auch nicht ganz richtig: Die entsprechende Operation für Sets heißt `|`. Auch für normale Sets gibt es keinen `+`-Operator. `|=` funktioniert dagegen mit Sets und Frozensets gleich gut.Leonidas hat geschrieben:Ja, zu einem neuen Tupel (weil du += und nicht + verwendest). Geht mitsape hat geschrieben:Naja, ganz so ist es nicht.Frozenset hat den gleichen Sinn einem Set gegenüber wie ein Tupel gegenüber einer Liste.
Mit ``+`` kann man mehrer ``tuple``s Zusammenfügen:Code: Alles auswählen
x = tuple([1,2,3,4,5,6]) x += tuple(['a', 'b', 'c']) print x
ebenso.Code: Alles auswählen
x = frozenset((1, 2)) x = x.union(frozenset((3, 4)) print x
Es besitzt keine __add__/__radd__ Methode: macht aber nur sinn wenn man zwei Frozensets zusammennehmen will. Und um solche Sets zu erstellen, braucht man sowieso erstmal eine Liste oder ein Tupel. Sets und Tupel zu addieren ist ja unlogisch.sape hat geschrieben:Von daher, hinkt der Vergleich von dir, da ein ``tuple`` diesbezüglich doch mächtiger ist -> Es ist zwar immutable, aber man merkt es nicht wirklich als benutzer im Gegensatz zu ``frozenset``.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Inwiefern "schnell"?sape hat geschrieben: In letzter Zeit verwende ich mehr ``tuple``s als ``list``, wenn es nur um einen "rohen" Container brauche (meist Temporär). Eben weil es Speicherschonend und extrem schnell ist.
Wie schon geschrieben, die entsprechende Operation für frozensets ist `|`.Mit ``frozenset`` ist so eine Kontatktion mit ``+`` nicht`möglich ohne den Umweg eines ``tuples``. Daher sehe ich den Sinn nicht. Der Konvert ins ``tuple`` Kostet auch Zeit.