Hmm
es liegt anscheinend wirklcih am remove.....
wenn ich nicht remove dann fuktionierts.
Hmm wie könnte ich das denn umgehen?
Meine Liste muss leider kürzer werden also die Elemente die ich bereits abgearbeitet habe muss ich löschen...
Code-Hilfe
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Eine zweite Liste (identische) erstellen (kopieren) und aus dieser die Werte löschen. Wäre mein Vorschlag, so aus dem Bauch heraus. Nicht schön, kommt mir aber einfach zu programmieren vor.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich würde es umgekehrt machen, also die Liste kopieren, über die Kopie iterieren und aus der originalen Liste löschen. Im anderen Fall macht sich das Löschen ja nicht "nach aussen" bemerkbar.
Wenn die Funktion die Liste ohne die Duplikate als Rückgabewert haben soll, dann ist es aber schneller am Anfang eine leere Ergebnisliste anzulegen und in der Schleife immer die "guten" Elemente anzuhängen und die "bösen" einfach wegzulassen. Vereinfacht so:
Wenn die Funktion die Liste ohne die Duplikate als Rückgabewert haben soll, dann ist es aber schneller am Anfang eine leere Ergebnisliste anzulegen und in der Schleife immer die "guten" Elemente anzuhängen und die "bösen" einfach wegzulassen. Vereinfacht so:
Code: Alles auswählen
def foo(sequence, sample):
result = list()
for element in sequence:
if good(element):
result.append(element)
else:
print "Duplikat"
return result
Das ist nicht wirklich Inkonsistent. Nehmen wir mal an wir wollen alle 2en in einer Schleife aus einer Liste löschen. Die erste Zahl gibt immer den Schleifen-Index an, also auf welches Element zugegriffen wird, dann folgt die Liste und ich mache einen Stern unter das aktuelle Element:Anonymous hat geschrieben:Hmm black....ich finde es halt seltsam dass das Programm eigentlich funktioniert solange eben keine zwei gleiche Elemente aufeinander folgen....
Damit würde es doch heißen dass der Pointer intern nicht durcheinander kommt ...
Und da das removen von einem Objekt immer das erste rauslöscht finde ich es komisch dass eine derartige Inkonsistenz zustande kommt....
Code: Alles auswählen
0. [1,2,2,3]
*
1. [1,2,2,3] # Hui wir haben eine 2 gefunden also...
*
2. [1,2,3] # entfernen und zum nächsten Schritt.
*
Vielen Dank an Euch und auch an Black!
Ich denke mir ist es vieles klarer. Habe wieder was dazugelernt
Ja das mit der Inkonsistenz bzw. Konsistenz leuchtet mir jetzt ein...Und das mit dem Pointer etc....wow!Danke Black für die Erklärung.
Ich habe mein Problem einfach anders gelöst. Für jedes Element einen Bool Wert mitschleppen und am Ende alle mit dem einen Wert rausziehen....so in der Art. Vielleicht nicht ganz effizient aber es funktioniert
Danke nochmals für eure HIlfe....
Dieses Forum ist immer wieder super!!!
Ich denke mir ist es vieles klarer. Habe wieder was dazugelernt
Ja das mit der Inkonsistenz bzw. Konsistenz leuchtet mir jetzt ein...Und das mit dem Pointer etc....wow!Danke Black für die Erklärung.
Ich habe mein Problem einfach anders gelöst. Für jedes Element einen Bool Wert mitschleppen und am Ende alle mit dem einen Wert rausziehen....so in der Art. Vielleicht nicht ganz effizient aber es funktioniert
Danke nochmals für eure HIlfe....
Dieses Forum ist immer wieder super!!!
Ich habe Deine Beschreibung auf die Frage von Dookie, was das Skript eigentlich tun soll, mal nahezu "wortwörtlich" in Python umgesetzt. Das ist recht effizient. Jedes Element wird nur einmal betrachtet und man braucht auch keine Extradaten.
In der ersten Schleife wird das erste Auftreten von dem "Tupel" gesucht und wenn es gefunden wird, wird "OK" ausgegeben und in der zweiten Schleife werden dann die beiden verschiedenen Varianten von Duplikaten gesucht, rausgefiltert und entsprechende Ausgaben gemacht. Das Ergebnis ist:
Code: Alles auswählen
data = [["A", 2], ["B", 4], ["I", 6], ["L",8],
["A", 6], ["T", 6], ["C", 4], ["A",2]]
def foo(iterable, sample):
it = iter(iterable)
for element in it:
yield element
if element == sample:
print 'OK'
break
(sample_str, sample_int) = sample
for element in it:
(element_str, element_int) = element
if element_str == sample_str:
if element_int == sample_int:
print 'DUPLICATE'
else:
print 'DIFFERENT'
else:
yield element
print list(foo(data, data[0]))
Code: Alles auswählen
OK
DIFFERENT
DUPLICATE
[['A', 2], ['B', 4], ['I', 6], ['L', 8], ['T', 6], ['C', 4]]