Seite 1 von 2

Verfasst: Sonntag 6. Februar 2005, 18:18
von Gast
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...

Verfasst: Sonntag 6. Februar 2005, 18:49
von Leonidas
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.

Verfasst: Montag 7. Februar 2005, 00:07
von BlackJack
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:

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

Verfasst: Montag 7. Februar 2005, 00:18
von BlackJack
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....
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:

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.
        *
Und siehe da, durch das Aufrücken aller Elemente nach vorne und das gleichzeitige Weitersetzen des Pointers wird, die zweite 2 übergangen. Wenn die letzten beiden Zahlen vertauscht wären, dann wäre uns die 3 entgangen und wir würden die 2 betrachten und entfernen. Damit wäre dann auch geklärt, warum Dein Code scheinbar funktioniert, wenn Du ein Element dazwischen einfügst. Dieses Element wird aber nie überprüft.

Verfasst: Montag 7. Februar 2005, 16:45
von Gast
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!!!

Verfasst: Montag 7. Februar 2005, 23:43
von BlackJack
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.

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]))
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

OK
DIFFERENT
DUPLICATE
[['A', 2], ['B', 4], ['I', 6], ['L', 8], ['T', 6], ['C', 4]]