Seite 1 von 1

Zugriff auf Listen Index

Verfasst: Mittwoch 6. September 2006, 13:28
von Toast
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

Verfasst: Mittwoch 6. September 2006, 13:35
von Nirven
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?

Verfasst: Mittwoch 6. September 2006, 13:44
von ws
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

Verfasst: Mittwoch 6. September 2006, 13:54
von Toast
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?

Verfasst: Mittwoch 6. September 2006, 14:16
von Nirven
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?

Verfasst: Mittwoch 6. September 2006, 14:17
von 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.

Verfasst: Mittwoch 6. September 2006, 14:45
von Joghurt
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.

Verfasst: Mittwoch 6. September 2006, 17:00
von Toast
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

Verfasst: Mittwoch 6. September 2006, 17:32
von Joghurt
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)

Verfasst: Mittwoch 6. September 2006, 17:51
von CM
@Joghurt: So eine Fragestellung habe ich schon häufiger gesehen. Wäre Dein Snippet etwas fürs Wiki?

Christian