Hallo,
mir leuchtet nicht ganz ein, weshalb die Python Doku 'set' und 'frozenset' nicht zu den Sequence Types zählt.
Warum ist das wohl so?
mutetella
Built-in Type Unterscheidung...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@mutetella: Weil Sequenzen eine Reihenfolge haben und aufsteigende, ganze Zahlen auf Werte abbilden in eben dieser Reihenfolge. `set`\s sind weder geordnet noch kann man generell mit ganzen Zahlen auf die Elemente zugreifen.
Warum hättest Du jetzt gemeint das `set`\s Sequenzen sein müssten/könnten?
Warum hättest Du jetzt gemeint das `set`\s Sequenzen sein müssten/könnten?
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Weil hier steht, dass Sequences eine __getitem__-Methode haben müssen, und das ist bei set und frozenset nicht der Fall.
Gruß,
Mick.
Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Aus dem gleichen Grund aus dem dict keine Sequenz ist. set und frozenset lassen sich nicht sinnvoll als Sequenz implementieren.
Python wird diese Typen wahrscheinlich genauso wie dict mit einem hashtable implementieren.
Python wird diese Typen wahrscheinlich genauso wie dict mit einem hashtable implementieren.
@DasIch: Man kann Mengen auf Basis von binären Suchbäumen durchaus als Sequenz implementieren, wenn man das möchte.
Weil ich zu kurz darüber nachgedacht habe...BlackJack hat geschrieben:Warum hättest Du jetzt gemeint das `set`\s Sequenzen sein müssten/könnten?
'sets' sind iterierbar und haben offensichtlich den Vorteil, dass der Inhalt in einer festen Reihenfolge platziert ist. Jedenfalls nennst Du das in diesem Beitrag als eine Eigenschaft. Und ich kann auch nicht erkennen, dass die Reihenfolge wie z. B. bei dictionarys wild durcheinandergeworfen wäre. Obwohl die Doku eigenartigerweise schreibt:
"A set object is an unordered collection of distinct hashable objects."
Deshalb kam mir das komisch vor, dass 'sets' trotz dieser Sequenz-Eigenschaften einen eigenen type darstellen.
Mit Euren Hinweisen ist mir das jetzt aber schon klarer..., danke!
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Stimmt.DasIch hat geschrieben:Der Inhalt von sets ist definitiv nicht in einer festen Reihenfolge platziert, ...
Zumindest werden strings und integer (nach ihrer Größe?) sortiert.
Code: Alles auswählen
In [72]: s = set()
In [74]: s.add(3)
In [75]: s.add('a')
In [76]: s.add('B')
In [77]: s.add(2)
In [78]: s
Out[78]: set([2, 3, 'B', 'a'])
Code: Alles auswählen
class Test(object):
def __init__(self, ident):
self.ident = ident
def __cmp__(self, other):
return cmp(self.ident, other.ident)
Code: Alles auswählen
In [65]: s = set()
In [66]: s.add(Test(3))
In [67]: s.add(Test(0))
In [68]: s.add(Test(2))
In [69]: for look in s:
....: look.ident
....:
....:
Out[69]: 3
Out[69]: 0
Out[69]: 2
Code: Alles auswählen
In [87]: def test_0():
....: print 'Ich bin eine Null!'
....:
....:
In [88]: def test_1():
....: print 'Ich bin die Nummer 1!'
....:
....:
In [89]: def test_2():
....: print 'Ich bin Mittelmaß!'
....:
....:
In [90]: s = set()
In [91]: s.add(test_2)
In [92]: s.add(test_0)
In [93]: s.add(test_1)
In [94]: s
Out[94]:
set([<function test_0 at 0x13a4de8>,
<function test_1 at 0x13a4ed8>,
<function test_2 at 0x13a4f50>])
mutetella
EDIT: Stimmt nicht:
Code: Alles auswählen
In [95]: for look in s:
....: look()
....:
....:
Ich bin Mittelmaß!
Ich bin eine Null!
Ich bin die Nummer 1!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@mutetella: Bei `set`\s ist die Reihenfolge "zufällig". Das heisst es kann auch zufällig mal "geordnet" sein, aber da kann man sich halt nicht drauf verlassen.
In meinem Beitrag den Du verlinkt hast, habe ich Eigenschaften aufgezählt nach welchen man die Datenstruktur auswählen kann, nicht Eigenschaften die auf `set`\s zutreffen müssen. Wenn die Reihenfolge wichtig ist, kann man eben keine `set`\s verwenden.
In meinem Beitrag den Du verlinkt hast, habe ich Eigenschaften aufgezählt nach welchen man die Datenstruktur auswählen kann, nicht Eigenschaften die auf `set`\s zutreffen müssen. Wenn die Reihenfolge wichtig ist, kann man eben keine `set`\s verwenden.
Ok.BlackJack hat geschrieben:Bei `set`\s ist die Reihenfolge "zufällig". Das heisst es kann auch zufällig mal "geordnet" sein, aber da kann man sich halt nicht drauf verlassen.
Leider bin ich anfangs dem an dieser Stelle kontraproduktiven Komfort von iPython aufgesessen.
iPython:
Code: Alles auswählen
In [120]: s = set(sorted(['a', 'b', 'c', 'A', 'B', 'C', 0, 2, 1], reverse=True))
In [121]: s
Out[121]: set([0, 1, 2, 'A', 'B', 'C', 'a', 'b', 'c'])
In [122]: print s
set(['a', 'A', 'c', 'b', 0, 1, 2, 'C', 'B'])
Code: Alles auswählen
>>> s = set(sorted(['a', 'b', 'c', 'A', 'B', 'C', 0, 2, 1], reverse=True))
>>> s
set(['a', 'A', 'c', 'b', 0, 1, 2, 'C', 'B'])
>>> print s
set(['a', 'A', 'c', 'b', 0, 1, 2, 'C', 'B'])
Boah, da hast Du mich aber sauber auflaufen lassen...BlackJack hat geschrieben:In meinem Beitrag den Du verlinkt hast, habe ich Eigenschaften aufgezählt nach welchen man die Datenstruktur auswählen kann, nicht Eigenschaften die auf `set`\s zutreffen müssen. Wenn die Reihenfolge wichtig ist, kann man eben keine `set`\s verwenden.
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@mutetella: Sorry, werde versuchen demnächst eindeutiger zu formulieren.
Und ja, IPython ist echt unverschämt was den Komfort angeht.
Und ja, IPython ist echt unverschämt was den Komfort angeht.