Seite 1 von 1
index bei verschachtelten Listen (anfänger)
Verfasst: Freitag 11. Dezember 2009, 21:06
von doca82
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
Verfasst: Freitag 11. Dezember 2009, 21:14
von Defnull
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.
Verfasst: Freitag 11. Dezember 2009, 21:21
von doca82
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]?!
Verfasst: Freitag 11. Dezember 2009, 21:36
von cofi
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.
Verfasst: Freitag 11. Dezember 2009, 21:40
von doca82
aaah okay
ich muss also eine verschachtelte Liste ohne Tuple sondern mit anderen Listen haben, damit das klappt, oder?
Danke
Verfasst: Freitag 11. Dezember 2009, 22:08
von doca82
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?!
Verfasst: Freitag 11. Dezember 2009, 22:28
von numerix
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.
Verfasst: Freitag 11. Dezember 2009, 22:51
von doca82
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')]
Verfasst: Freitag 11. Dezember 2009, 23:22
von ms4py
Warum verwendest du nicht einfach eine sinnvolle SQL Abfrage, wenn du eh schon mit einer DB arbeitest?!
Verfasst: Freitag 11. Dezember 2009, 23:34
von 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:
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.
Verfasst: Samstag 12. Dezember 2009, 10:51
von doca82
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