Seite 1 von 1

Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 14:39
von mutetella
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

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 14:52
von 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?

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 14:53
von pillmuncher
Weil hier steht, dass Sequences eine __getitem__-Methode haben müssen, und das ist bei set und frozenset nicht der Fall.

Gruß,
Mick.

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 14:53
von DasIch
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.

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 15:25
von lunar
@DasIch: Man kann Mengen auf Basis von binären Suchbäumen durchaus als Sequenz implementieren, wenn man das möchte.

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 16:18
von mutetella
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

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 16:27
von DasIch
Der Inhalt von sets ist definitiv nicht in einer festen Reihenfolge platziert, wenn dies der Fall sein sollte ist es bestenfalls ein Implementationsdetail.

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 17:37
von mutetella
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?

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 17:51
von 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.

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 20:00
von mutetella
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

Re: Built-in Type Unterscheidung...

Verfasst: Freitag 20. Mai 2011, 20:55
von BlackJack
@mutetella: Sorry, werde versuchen demnächst eindeutiger zu formulieren.

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