Built-in Type Unterscheidung...

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@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?
Benutzeravatar
pillmuncher
User
Beiträge: 1482
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.
In specifications, Murphy's Law supersedes Ohm's.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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

@DasIch: Man kann Mengen auf Basis von binären Suchbäumen durchaus als Sequenz implementieren, wenn man das möchte.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

BlackJack hat geschrieben:Warum hättest Du jetzt gemeint das `set`\s Sequenzen sein müssten/könnten?
Weil ich zu kurz darüber nachgedacht habe... :oops:
'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 ;-) )
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Inhalt von sets ist definitiv nicht in einer festen Reihenfolge platziert, wenn dies der Fall sein sollte ist es bestenfalls ein Implementationsdetail.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

DasIch hat geschrieben:Der Inhalt von sets ist definitiv nicht in einer festen Reihenfolge platziert, ...
Stimmt.
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'])
Exemplare nicht:

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
Funktionen aber dann schon wieder:

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>])
Wenn Funktionen in einer bestimmten Reihenfolge ausgeführt werden müssen, sollte man doch lieber auf 'list' oder 'tuple' zurückgreifen?

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!
Was denn nun?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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.
Ok.
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'])
Python interpreter:

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'])
Sowas ist aber echt auch fies...! :)
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.
Boah, da hast Du mich aber sauber auflaufen lassen... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Sorry, werde versuchen demnächst eindeutiger zu formulieren.

Und ja, IPython ist echt unverschämt was den Komfort angeht. :-)
Antworten