For i in Liste; Liste aktualisieren?

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
PEID

Hallo liebe Gemeinde,

Mein Problem besteht darin das meine For-Schleife eine Liste abläuft welche innerhalb der Schleife verändert wird. Doch leider nimmt die For-Schleife keine Notiz von dieser Veränderung :(

Gibt es hier vlt. irgendwie die Möglichkeit die ab-zulaufende Liste während des Abschreitens dieser, sie zu aktualisieren?

Bei den folgenden Code-Stück habe ich versucht das Problem einmal nach-zubauen. (siehe Kommentar).

mfG PEID


Nachbau:

Code: Alles auswählen

Buch=['A','B','C','D','E']

for i,j in enumerate([Buch[0], Buch[1], Buch[2], Buch[3] ,Buch[4]]):
    if i+1 >= len(Buch):
        break
    Buch[i+1]= j + Buch[i+1]    

print Buch

"""
AUSGABE: ['A', 'AB', 'BC', 'CD', 'DE']

erwünschte Lsg: ['A', 'AB', 'ABC', 'ABCD', 'ABCDE']

Buch[1] --> nach 1. Durchlauf --> AB
Buch[2] --> nach 2. Durchlauf --> ABC
..."""
eigentliches Problem (Auszug):

Code: Alles auswählen

        a=len(self.zeilen)
        dt=range(0, a)       
        for i in range(0, a):
            ndt=re.findall('<a href=\"/deutsch-englisch.*?</td>', self.zeilen[i], re.S)
            for j in [['<.*?>','',ndt[0]],[' +$','',dt[i]],['  ',' ',dt[i]]]:   
                dt[i]=re.sub(j[0], j[1], j[2])

"""Problem: dt[i] (j[2]) wird innerhalb der Schleife verändert aber nicht in ab-zulaufenden Liste berücksichtigt :( """
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich verstehe ehrlich gesagt dein Problem nicht wirklich!

Aber Du scheinst HTML parsen zu wollen? Dafür sind RegExps nicht wirklich geeignet. Evtl. löst sich das Problem, indem Du einen dafür geeigneten Parser wie lxml oder html5lib verwendest. Such einfach mal hier im Forum - wir haben pro Tag fast immer einen Thread dazu :-D

Desweiteren mal in die wiki.FAQ gucken - da steht zu dem Thema auch was!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hab jetzt nur dein Beispiel angeschaut, aber so müsste es gehen (ungetestet):

Code: Alles auswählen

buch = ['A', 'B', 'C', 'D', 'E']
neu = ''
liste = []
for buchstabe in buch:
    neu += buchstabe
    liste.append(neu)
    print neu
print 'Gesamt: ', liste
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo PEID, willkommen im Forum,

Ich schließe mich Hyperion an: was ist das Problem das du über das Modifizieren einer Liste über die du iterierst eigentlich lösen willst?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@PEID: Ein paar Bemerkungen zum Auszug über das Problem:

`range()` sollte man nur verwenden, wenn man wirklich eine Liste mit Zahlen braucht. Nicht wenn man nur irgendeine Liste bestimmter Länge benötigt, das bietet sich eher ``[None] * length`` an, noch wenn man Indexe in eine andere Datenstruktur braucht. Die braucht man nämlich in 99,9% der Fälle gar nicht, weil man in der Regel direkt über Elemente dieser Datenstruktur iterieren kann.

Die Namen sind teilweise sehr nichtssagend, und ob man `j` an etwas anderes als ganze Zahlen binden sollte ist fragwürdig. `i`, `j`, und `k` sind typische Namen für Schleifenzähler und viele Programmierer erwarten da einfach Zahlen.

Warum verwendest Du `re.findall()`, wenn Du dann doch nur das erste Element davon verarbeitest?

Und die für die beiden letzten Ersetzungen sind reguläre Ausdrücke ein wenig Overkill, das kann man auch mit Methoden auf `str` erreichen. Ausserdem funtkioniert das mit dem ``dt`` so nicht. Zu dem Zeitpunkt wo das ausgewertet wird, ist dort immer noch eine Zahl in `dt`, also gilt ``dt == i``. Ungetestet:

Code: Alles auswählen

        result = list()
        for line in self.lines:
            match = re.search('<a href=\"/deutsch-englisch.*?</td>',
                              line,
                              re.DOTALL)
            without_tags = re.sub('<.*?>', '', match.group(0))
            result.append(without_tags.rstrip(' ').replace('  ', ' '))
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

@ BlackJack: Was für einen Vorteil bringt es nicht range(x) zu verwenden, sondern [None] * x ?
BlackJack

Bei `range(x)` werden `x` verschiedene Zahlobjekte angelegt, die natürlich mehr Speicher brauchen als `x` Referenzen auf ein Platzhalterobjekt. Bei kleinen `x` ist das natürlich kein grosses Problem, aber es bleibt IMHO ein "stilistisches", weil man keine Objekte anlegen sollte, die man überhaupt nicht verwendet.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke, das wollte ich wissen!
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Alternativ gäbs ja auch noch xrange(x).
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
lunar

Was hier gar nichts hilft, weil es dem OP nicht um eine Folge von Zahlen, sondern um eine Liste einer bestimmten Größe geht ;)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

list(take(5, repeat(None)))
;)
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

lunar hat geschrieben:Was hier gar nichts hilft, weil es dem OP nicht um eine Folge von Zahlen, sondern um eine Liste einer bestimmten Größe geht ;)
Grml.
Ich sollte zumindest 5 Stunden Schlaf bekommen ab jetzt. ;)
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
PEID

Hy; i'm Back

erstmal vielen Dank für die vielen posts. Ich habe mich auch noch mal über mein Problem auseinandergesetzt und zu guter Ende lag die Lösung ja beinahe die ganze Zeit auf der Hand und dann noch so primitiv (siehe Verlauf Post).

@Hyperion
Du scheinst HTML parsen zu wollen?
Ja, aber da dies für mich momentan Neuland ist habe ich mich erstmal für RegExps entschieden. Mein Prg ist ja eh nur zur Übung und da darf es doch ruhig am Anfang einwenig 'Overkill' sein. Mit parsen setze ich mich mal ein andermal auseinander.

@Leonidas
was ist das Problem das du über das Modifizieren einer Liste über die du iterierst eigentlich lösen willst?
Ich habe Zeichenketten vorliegen bei welchen ich doppelte Leerzeichen, Leerzeichen am Ende der Zeichenkette etc. entfernen bzw. ersetzen wollte.
Dies wollte ich eigentlich wie folgt lösen (wobei string(mod_1) die Modifikation von String(org) ist):

Code: Alles auswählen

string='ICH BIN EINE ZEICHENKETTE!'
for Ausdruck in [[pattern_1, repl_1, string(org)],[pattern_2, repl_2, string(mod_1)],[pattern_3, repl_3, string(mod_2)]]:
    string=re.sub(Ausdruck[0], Ausdruck[1], Ausdruck[2])
Jedoch wird die zu iterierende Liste scheinbar vollständig/statisch zu Beginn der Schleife erzeugt wodurch string(org)==string(mod_1)==string(mod_2) gilt und somit lediglich Ausdruck[2] wirkt um den String zuverbessern.

Nun habe ich es erstmal wie folgt gelöst:

Code: Alles auswählen

for Ausdruck in [[pattern_1,repl_1],[pattern_2,repl_2],[pattern_3,repl_3]]:
    string=re.sub(Ausdruck[0], Ausdruck[1], string)
Wie man nun unschwer erkennen lässt hatte ich mich wohl da in etwas verrannt :( . ABER SCHLIEßLICH LERNT MAN JA AUS FEHLERN :lol:

@BlackJack
Warum verwendest Du `re.findall()`, wenn Du dann doch nur das erste Element davon verarbeitest?
Ich erhalte mit re.findall() in meinen Anwendungsbeispiel auch nur eine Liste mit einen Element. Okay, bestimmt nicht die beste Wahl =D
Antworten