Python - iterieren über eine Liste variabler Länge


#1
Guten Morgen,

ich hab folgendes vor in Python 2.7.x:
- eine Funktion bekommt als Parameter eine Liste von Objekten
- über diese Liste wird iteriert, jedes Objekt wird untersucht/bearbeitet und eventuell aus der Liste gelöscht

Hat jemand schon einmal etwas ähnliches gemacht und wo könnten Probleme auftreten? Ich bin mir nicht sicher, wie xrange() in diesem Fall genau arbeitet und ob es überhaupt in diesem Fall ein guter Ansatz ist.

So stelle ich mir das vor:

Code:
def removeInvalidEntries(objectList):
    index = 0
    deleted = 0
    valid = False
        for object in xrange(objectList):
            #
            # object untersuchen, Variable 'valid' entsprechend setzen 
            #
            if valid == False:
                del objectList[index]
                deleted += 1
            else:
                index += 1
    return deleted
Kann man das so mache ohne böse Seiteneffekte?

Traveller
 
#2
kleiner Nachtrag...
xrange über eine Liste geht so nicht, das Argument muss ein Integer sein, so was wie len(objectList), das zerhaut mir allerdings mein 'object', mit dem ich innerhalb der schleife arbeiten wollte...
Ist wohl besser, das in Java zu implementieren.

Traveller
 
#3
Hallo,

am einfachsten wäre dein Vorhaben wohl mit einer List Comprehension zu lösen:

Python:
def removeInvalidEntries(objectList):
    oldLen = len(objectList)
    objectList[:] = [o for o in objectList if isValid(o)]
    return oldLen - len(objectList)
Ist wohl besser, das in Java zu implementieren.
Kommt drauf an, was du unter „besser“ verstehst. Mir gefällt die Python-Variante jedenfalls besser als:
Java:
public int removeInvalidEntries(Collection<Foo> collection) {
    int removed = 0;
    Iterator<Foo> it = collection.iterator();
    while (it.hasNext()) {
        Foo foo = it.next();
        if (!foo.isValid()) {
            it.remove();
            removed++;
        }
    }
    return removed;
}
Grüße,
Matthias