dinsdale hat geschrieben:Jetzt will ich die beiden letzten Elemente vergleichen
Hallo Thomas!
Willkommen im Python-Forum!
Shelve verhält sich wie ein Dictionary und nicht wie eine Liste. Bei einem Dictionary kannst du nur auf benannte Elemente zugreifen und nicht auf das Vorletzte oder das zehnte. Das geht nicht.
Du könntest dir aber irgendwo eine Liste der Elemente in der von dir gewünschten Reihenfolge abspeichern. -- Sogar ins Shelve selbst.
Code: Alles auswählen
>>> import shelve
>>> sh = shelve.open("J:\\Ablage\\shelvetest.shelve")
>>> sh_index = []
>>> person1 = {"vorname": "Max", "nachname": "Thompson"}
>>> sh["person1"] = person1
>>> sh_index.append("person1")
>>> person15 = {"vorname": "Maxi", "nachname": "Mustermann"}
>>> sh["person15"] = person15
>>> sh_index.append("person15")
>>> # Erste, eingefügte Person anzeigen
>>> sh[sh_index[0]]
{'nachname': 'Thompson', 'vorname': 'Max'}
>>> # Letzte, eingefügte Person anzeigen
>>> sh[sh_index[-1]]
{'nachname': 'Mustermann', 'vorname': 'Maxi'}
>>> # Du kannst den Index auch ins Shelve packen
>>> sh["sh_index"] = sh_index
>>> person30 = {"vorname": "Tom", "nachname": "Dreissger"}
>>> sh["person30"] = person30
>>> sh_index = sh["sh_index"]
>>> sh_index.append("person30")
>>> sh["sh_index"] = sh_index
>>> # Letzte, eingefügte Person anzeigen
>>> sh[sh["sh_index"][-1]]
{'nachname': 'Dreissger', 'vorname': 'Tom'}
>>> sh.close()
>>>
Das Speichern des Index (also der Liste) im Shelve selbst, begrenzt aber auch die Geschwindigkeit des Shelve bei vielen tausenden Einträgen. Der Index wird ja immer größer und muss immer wieder komplett neu geschrieben und im Ganzen ausgelesen werden. Aber unter ein paar tausend Einträgen würde ich mir kein Problem damit machen. Du könntest den Index ja auch begrenzen. Wenn du immer nur die letzten 100 Einträge brauchst, dann kannst du den Index ja auch auf diese Einträge begrenzen.
Wenn es mehr werden sollte, oder wenn du weitere Suchmöglichkeiten brauchst, dann würde ich mir den Einsatz einer Datenbank überlegen. SQLite ist da ein guter Anfang.
mfg
Gerold