Zugriff auf Listen Index

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
Toast
User
Beiträge: 7
Registriert: Mittwoch 6. September 2006, 12:49

Hi,

ich habe z.B. folgende Datenstruktur:

Code: Alles auswählen

[{'a':1},{'a':4},{'a':5}]
Wie bekomme ich den Listen Index von einen Dictonary, wenn ich nur den Wert dessen Key weiss? Hat da jemand eine Idee? Ich moechte nur ungern die ganze Liste in einer Schleife durcharbeiten.

Danke,
Toast
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Ein Dictionary kannst du nicht über einen Index ansprechen, da die Reihenfolge der Elemente nicht definiert ist. Aber wenn du den Key weißt, wo genau ist das Problem?
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Hi Toast,

was du da als Beispiel gegeben hast. ist ja eine Liste von 3 Python-Dictionaries mit jeweils einem Schlüssel. Meintest Du das auch so? In Deinem Beispiele sind die Schlüssel aller Dictionaries identisch, es ist also nicht klar, ob jetzt der Index 0, 1, 2 das von Dir gesuchte darstellt.

Gruss

ws
Toast
User
Beiträge: 7
Registriert: Mittwoch 6. September 2006, 12:49

Ja, es ist eine Liste mit 3 Dictonaries. Ich hab mich evtl. etwas unklar ausgedrueckt....

Wenn ich z.B. den Wert 5 habe (was in diesem Beispiel das 3. Dictonary waere), wie bekomme ich dann den Listen Index 2, damit ich per liste[2] auf das komplette Dictonary zugriffen kann?
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Ah :)

Hm, du musst schon prüfen, in welchem Dictionary der Wert steht. Und dafür die Liste durch gehen, und bei jedem Dictionary prüfen, ob der Wert in einem der Values vorkommt.

Weißt du denn, dass jeder Wert nur einmal vorkommt?
BlackJack

Da wirst Du die Liste durchgehen müssen bis Du das gewünschte gefunden hast.

Code: Alles auswählen

def search_index(key, value, items):
    for index, item in enumerate(items):
        if item[key] == value:
            return index
    raise ValueError('key/value (%r, %r) not in items' % (key, value))

def main():
    data = [{'a': 1}, {'a': 4}, {'a': 5}]
    print search_index('a', 5, data)
Wenn Du öfter auf diese Datenstruktur über den Wert zu einem Schlüssel zugreifen musst, dann solltest Du Dir eine andere Datenstruktur ausdenken. Zum Beispiel ein Dictionary über das man gezielt auf die anderen Dictionaries zugreifen kann.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Warum brauchst du überhaupt eine solche Datenstruktur?

Brauchst du nicht u.U. vielleicht einfach ein dictionary, dass Werte nicht ersetzt, sondern hinzufügt? Also z.B.

Code: Alles auswählen

d = AppendDict() # AppendDict muss noch definiert werden
d['a'] = 1
print d['a'] # -> [1]
d['a'] = 2
print d['a'] # -> [1,2]
Ich brauchte sowas mal, und AppendDict sind nur ein paar Zeilen, die ich jetzt aber nicht schreiben will, wenn das eh nicht dein Problem löst.
Toast
User
Beiträge: 7
Registriert: Mittwoch 6. September 2006, 12:49

Ok, ich hab mir schon fast gedacht, dass ich die Liste nochmal komplett durchgehen muss. Das waere bei vielen Daten uneffektiv. Dann werde ich wohl das ganze auf ein reines Dictionary umbauen.

Das mit AppendDict klingt recht interessant. Magst du mir evtl. den Code
posten? Das waere naemlich auch ein sehr guter Ansatz :D

Danke,
Toast
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Bitteschön, ging sogar noch kürzer, als ich es in Erinnerung hatte:

Code: Alles auswählen

class AppendDict(dict):
    def __setitem__(self, item, value):
        self.setdefault(item, []).append(value)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@Joghurt: So eine Fragestellung habe ich schon häufiger gesehen. Wäre Dein Snippet etwas fürs Wiki?

Christian
Antworten