`del` braucht man fast nie. Wobei das "fast" für Anfänger "wirklich niemals, auch wenn Du denkst, es wäre so, nein Du brauchst es nicht" heißen sollte.
Wenn man eine leere Liste möchte, dann legt man eine neue leere Liste an.
Wenn die elif-Bedingung exakt das Gegenteil der vorangegangenen if-Bedingung ist, dann ist das ein Fall für `else`.
Gerade bei längeren elif-Ketten sollte es immer einen `else`-Block geben, damit der Leser weiß, was in Fällen passieren soll, die nicht schon vorher behandelt worden sind.
Ohne den Algorithmus verstanden zu haben, komme ich dann auf sowas:
Code: Alles auswählen
seq = [[1,1,2]]
temp = []
for x in range(5):
nseq = []
for i,v in enumerate(seq[-1]):
if len(seq[-1]) == i+1:
nseq.append(len(temp))
nseq.append(temp[-1])
nseq.append(1)
nseq.append(v)
temp = []
elif not temp or temp[-1] == v:
temp.append(v)
else:
nseq.append(len(temp))
nseq.append(temp[-1])
temp = []
temp.append(v)
seq.append(nseq)
print(seq)
Dort frage ich mich dann, warum `temp` vor der Schleife initialisiert wird, ob es also sein kann, ob `temp` am Anfang des inneren Schleifendurchlaufs nicht leer sein kann, und ob das Absicht ist, oder nicht.
Dann fällt mir die erste if-Abfrage auf, und ich frage mich, wann kann die `wahr` werden. `enumerate` zählt bis zur Länge der Liste - 1. Also wird die Bedingung immer beim letzten Schleifendurchgang war. Warum ist dann dieser Fall überhaupt innerhalb der Schleife und steht nicht nach der Schleife?
Das vereinfacht den Code erheblich:
Code: Alles auswählen
seq = [[1,1,2]]
temp = []
for x in range(5):
nseq = []
for v in seq[-1][:-1]:
if not temp or temp[-1] == v:
temp.append(v)
else:
nseq.append(len(temp))
nseq.append(temp[-1])
temp = []
temp.append(v)
nseq.append(len(temp))
nseq.append(temp[-1])
nseq.append(1)
nseq.append(seq[-1][-1])
temp = []
seq.append(nseq)
Jetzt wird auch klar, dass `temp` am Anfang immer leer ist. Im if und im else-Block ist der letzte Befehl der selbe, kann also außerhalb der Blöcke stehen. Damit ist der erste if-Block leer, man dreht also die if-Bedingung um und hat keinen else-Block mehr:
Code: Alles auswählen
seq = [[1,1,2]]
for x in range(5):
nseq = []
temp = []
for v in seq[-1][:-1]:
if temp and temp[-1] != v:
nseq.append(len(temp))
nseq.append(temp[-1])
temp = []
temp.append(v)
nseq.append(len(temp))
nseq.append(temp[-1])
nseq.append(1)
nseq.append(seq[-1][-1])
seq.append(nseq)
Wenn ich mir jetzt die Aufgabe durchlese, frage ich mich gerade, ob die Sonderbehandlung des letzten Elements überhaupt gewollt ist.
Code: Alles auswählen
seq = [[1,1,2]]
for x in range(5):
nseq = []
temp = []
for v in seq[-1]:
if temp and temp[-1] != v:
nseq.append(len(temp))
nseq.append(temp[-1])
temp = []
temp.append(v)
nseq.append(len(temp))
nseq.append(temp[-1])
seq.append(nseq)