index bei verschachtelten Listen (anfänger)

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
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

Hi Leute,
hier mal wieder eine elementare Anfängerfrage, auf die ich mir keinen Reim machen kann..

Code: Alles auswählen

o = [('muuh','puuh'),('gfd','puuh'),('jhgf','muuh')]
print o.index('muuh', [(0)(0),[(2)(1)]])
Warum gibt er mir nicht die indizes für 'muuh'?
Sondern sagt: TypeError: 'int' object is not callable

Gruß und Danke
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

1. weil 'muuh' in deiner Liste nicht vor kommt, sondern nur ('muuh','puuh').
2. weil (0)(0) = 0(0) = 0.__call__(0) = Fehler
3. Was versucht du da eigentlich zu tun? list.index() akzeptiert nur einen Parameter.
Bottle: Micro Web Framework + Development Blog
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

vielen Dank fpr die schnelle Antwort...
echt...habe das in der Doku anders verstanden:
L.index(value, [start, [stop]]) -> integer -- return first index of value

Was ich versuche ist, dass er mir die indizes von 'muuh' rausgibt

mit o.index('muuh') klappts nicht

EDIT:
aber wie du meintest, mit o.index(('muuh','puuh')) findet er es...

sind muuh und puuh nicht eigene Werte?
'muuh' befindet sich doch auf o[0][0]?!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

doca82 hat geschrieben:aber wie du meintest, mit o.index(('muuh','puuh')) findet er es...

sind muuh und puuh nicht eigene Werte?
'muuh' befindet sich doch auf o[0][0]?!
Ja sie sind eigene Werte, aber nur das Tupel ist Element der Liste, folglich kann die Liste nur das Tupel finden und nicht die Tupelelemente.
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

aaah okay :P

ich muss also eine verschachtelte Liste ohne Tuple sondern mit anderen Listen haben, damit das klappt, oder?
Danke
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

oh da drängt sich mir gleich die nächste peinliche Frage auf...
wie erhalte ich eine verschachtelte liste aus einer liste mit tuples?
mit list(o) bleibt alles beim alten?!

Code: Alles auswählen

o = [('muuh','puuh'),('gfd','puuh'),('jhgf','muuh')] 
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

doca82 hat geschrieben:oh da drängt sich mir gleich die nächste peinliche Frage auf...
wie erhalte ich eine verschachtelte liste aus einer liste mit tuples?
mit list(o) bleibt alles beim alten?!
Du willst die Tupel durch Listen ersetzen und denkst, das ändert etwas?

Vielleicht sagst du mal, was du *EIGENTLICH* willst, damit man dir vernünftig helfen kann.
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

ihr habt Recht, dann muss ich weiter ausholen....danke für die Geduld vorab...
Der Sinn des Ganzen ist, dass ich mir Datensätze zur Generierung von Rechnungen ausgeben lasse. Ich lasse mir eine Liste mit verschachtelten Tupeln aus einer Datenbank ausgeben. Da ich die Daten nochmals überarbeiten will, d.h. fast identische Datensätze zusammenfassen will, muss ich wissen welche datensätze fast identisch sind...

um Doppelgänger zu finden wollt ich diese Methode benutzen:

Code: Alles auswählen

def allindex(the_list, the_value):
    indexes = []
    try:
        search_from_here = 0
        while True:
            found_index = the_list.index(the_value, search_from_here)
            indexes.append(found_index)
            search_from_here = found_index + 1
    except ValueError:
        return indexes
Da das beispiel nur mit eindimensionalen Listen funktioniert(?!) wollte ich die Methode umschreiben...
deswegen die Frage mit dem index()

Wie muss ich allindex() umschreiben ,damit ich auch die Verschachtelungen mit indizieren kann?

Das Format was mir vorliegt ist wie im Beispiel oben etwa "o =[('a','b'),('b','r'),('i','g')]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Warum verwendest du nicht einfach eine sinnvolle SQL Abfrage, wenn du eh schon mit einer DB arbeitest?!
BlackJack

@doca82: Also erst einmal lässt sich Dein `allindex()` auch in einer Zeile ausdrücken:

Code: Alles auswählen

def get_all_indices(iterable, value):
    return [i for (i, v) in enumerate(iterable) if v == value]
Dein anderes Problem musst Du einfach in kleinere Teilprobleme aufteilen. Du willst ja anscheinend für jeden Index in die erste Liste bei der das zu suchende Objekt im "iterable" vorkommt, die Indexe dort zusammen mit dem äusseren Index in das Ergebnis packen. Also musst Du das halt auch in zwei Schritten lösen. Denjenigen, den Du schon hast, kombiniert mit einem für die äussere Liste.

Code: Alles auswählen

def iter_all_indices(iterable, value):
    return (i for (i, v) in enumerate(iterable) if v == value)


def iter_all_indices_2(iterable, value):
    for i, sub_iterable in enumerate(iterable):
        for j in iter_all_indices(sub_iterable, value):
            yield (i, j)


def main():
    data = [('muuh', 'puuh'), ('gfd', 'puuh'), ('jhgf', 'muuh')]
    print list(iter_all_indices_2(data, 'muuh'))
Ausgabe:

Code: Alles auswählen

[(0, 0), (2, 1)]
Zusätzlich zu ice2k3 Kommentar: Solche Algorithmen über verschachtelte Listen, Tupel, und Dictionaries werden schnell unübersichtlich. Da sollte man über Klassen nachdenken. Spätestens wenn man eine dritte Verschachtelungsstufe erreicht, ist eine Grenze erreicht, bei der man nach einem Jahr seine eigenen Programme nicht mehr so einfach durchschaut.
doca82
User
Beiträge: 48
Registriert: Mittwoch 16. September 2009, 19:39
Wohnort: Berlin

erst mal vielen Dank für die Hinweise
@ ice2k3: Ja wenn ich mapper beherrschen würde, wäre das Leben deutlich einfacher...vor allem im dem Umgang mit DBs. Selbst sinnvolle sql-Abfragen machen fällt mir noch recht schwer...

@ BlackJack vielen Dank für die Optimierung ;) Das mit den zwei Schritten bringt mich wirklich weiter...und ich merke mal wieder, dass ich mich mit pythons OOP noch nicht auskenne....

Vielen Dank
Antworten