Dict. aber Reihenfolge der Keys() wichtig :(

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

uups stimmt, hab halt nich alles getestet, is aber nur ne Abfrage nötig beim __repr__ und __str__:

Code: Alles auswählen

    def __str__(self):
        tpl = "{"+("%s : %s, "*len(self.__keylist))[:-2]+"}"
        if self.__keylist:
            data = [repr(x) for x in reduce(lambda a, b: a+b, self.iteritems())]
            return tpl % tuple(data)
        else:
            return tpl

    def __repr__(self):
        tpl = "Lict(["+("(%s, %s), "*len(self.__keylist))[:-2]+"])"
        if self.__keylist:
            data = [repr(x) for x in reduce(lambda a, b: a+b, self.iteritems())]
            return tpl % tuple(data)
        else:
            return tpl
nö super könnte man schlecht in einem Attribut speichern, dann könnte man von Lict keine Klassen mehr ableiten da ja super dann für diese abgeleiteten Klassen nicht mehr stimmen würde! Besser die Metaklasse für autosuper aus dem Beispiel auf der Pythonhomepagedokumentation zu Newstyleklassen verwenden.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mit __delitem__ scheint auch was nicht zu stimmen:

Code: Alles auswählen

  File "SortedDict.py", line 132, in ?
    del( MySortedDict["Key2"] )
  File "SortedDict.py", line 49, in __delitem__
    super(Lict, self).__delitem(key)
AttributeError: 'super' object has no attribute '_Lict__delitem'
Wie geht es außerdem einen Wert an einer bestimmten Stelle hinzuzufügen?

Code: Alles auswählen

    MyLict["Key1"]="Wert1"
    MyLict["Key2"]="Wert2"
    MyLict["Key3"]="Wert3"
Also Beispielsweise zwischen Key2 und Key3, soll MyLict["Key2b"]="Wert2b" rein...

Vielleicht ist es für mich persönlich doch einfach zwei Listen zu verwalten...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

Da fehlen 2 "_" :)

Code: Alles auswählen

    def __delitem__(self, key):
        if type(key) is Index:
            key = self.__keylist[key]
        super(Lict, self).__delitem__(key)
        del self.__keylist[key]
Das Einfügen an einem Bestimmten Index ginge so:

Code: Alles auswählen

    def insert(self, index, key, value):
        self.__keylist.insert(index, key)
        super(Lict, self)[key] = value
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dookie hat geschrieben:Da fehlen 2 "_" :)
das ist es nicht ganz:

Code: Alles auswählen

    def __delitem__(self, key):
        if type(key) is Index:
            key = self.__keylist[key]
        super(Lict, self).__delitem__(key)
        del self.__keylist[ self.__keylist.index(key) ]
(Die letzte Zeile ist anders)

Code: Alles auswählen

    MyLict.insert(2, "Key2", "Wert2")
Geht leider nicht:

Code: Alles auswählen

Traceback (most recent call last):
  File "SortedDict.py", line 138, in ?
    MyLict.insert(2, "Key2", "Wert2")
  File "SortedDict.py", line 54, in insert
    super(Lict, self)[key] = value
TypeError: object does not support item assignment
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Code: Alles auswählen

    def insert(self, index, key, value):
        self.__keylist.insert(index, key)
        super(Lict, self).__setitem__(key, value)
so getestet und läuft :)


Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jup! Jetzt geht's...

Damit man nicht den ganzen Thread durchlesen muß, hier nochmal die aktuelle Version, mit allen Verbesserungen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
    Modul:          Lict
    Description:    Mix of list and dict
    Version:        0.1.1
    Copyright:      2004 by Fritz Cizmarov fritz@sol.at
    Created:        16. Nov. 2004
    Last modified:  20. Nov. 2004
    License:        free
    Requirements:   Python2.3
    Exports:        Classes and Functions to export
"""


class Index(int):
    """ Helperclass for access Lict by Index """
    __slots__ = []

class Lict(dict):

    __slots__ = ["__keylist"]

    def __init__(self, *args, **kw):
        super(Lict, self).__init__(*args, **kw)
        self.__keylist = []
        if len(args) == 1 and isinstance(args[0], (tuple, list)):
            for key, value in args[0]:
                self.__keylist.append(key)
        for key in kw:
            self.__keylist.append(key)

    def __getitem__(self, key):
        if type(key) is Index:
            key = self.__keylist[key]
        return super(Lict, self).__getitem__(key)

    def __setitem__(self, key, value):
        """ sets item, if item not exists append it """
        if type(key) is Index:
            key = self.__keylist[key]
        elif key not in self.__keylist:
            self.__keylist.append(key)
        super(Lict, self).__setitem__(key, value)

    def __delitem__(self, key):
        if type(key) is Index:
            key = self.__keylist[key]
        super(Lict, self).__delitem__(key)
        del self.__keylist[ self.__keylist.index(key) ]

    def insert(self, index, key, value):
        self.__keylist.insert(index, key)
        super(Lict, self).__setitem__(key, value)

    def __str__(self):
        tpl = "{"+("%s : %s, "*len(self.__keylist))[:-2]+"}"
        if self.__keylist:
            data = [repr(x) for x in reduce(lambda a, b: a+b, self.iteritems())]
            return tpl % tuple(data)
        else:
            return tpl

    def __repr__(self):
        tpl = "Lict(["+("(%s, %s), "*len(self.__keylist))[:-2]+"])"
        if self.__keylist:
            data = [repr(x) for x in reduce(lambda a, b: a+b, self.iteritems())]
            return tpl % tuple(data)
        else:
            return tpl

    def __iter__(self):
        return iter(self.__keylist)

    def iteritems(self):
        for key in self.__keylist:
            yield key, self[key]

    iterkeys = __iter__

    def itervalues(self):
        for key in self.__keylist:
            yield self[key]

    def update(self, E):
        if not isinstance(E, Lict):
            raise TypeError("E is not from type Lict!")
        for key in E:
            self[key] = E[key]

    def pop(self, key=None):
        if key is None:
            key = self.__keylist[-1]
        elif type(key) is Index:
            key = self.__keylist[key]
        self.keylist.remove(key)
        return super(Lict, self).pop(key)

    def reverse(self):
        self.__keylist.reverse()

    def sort(self):
        self.__keylist.sort()






if __name__=="__main__":
    print "->",__file__,"<- SelbstTest\n"

    def LictAusgeben():
        print "="*40
        for k,v in MyLict.iteritems():
            print k,"-",v
        print "="*40

    MyLict = Lict()

    MyLict["Key1"]="Wert1"
    MyLict["Key2"]="Wert2"
    MyLict["Key3"]="Wert3"

    LictAusgeben()

    MyLict["Key2"]="Wert2XX"

    MyLict["Key4"]="Wert4"
    MyLict["Key5"]="Wert5"

    LictAusgeben()

    del( MyLict["Key2"] )

    LictAusgeben()

    MyLict.insert(2, "Key2", "Wert2NEU")

    LictAusgeben()
Antworten