Listen filtern in Python

Zum Abschluss dieser Woche kommt von meiner Seite noch ein wenig Code. Angenommen wir haben eine Liste von Benutzern (users) und möchten nur auf den gesperrten weiterarbeiten, so können wir diese, auf verschiedene Art und Weise filtern:


disabled_users = []
for user in users:
    if user.disabled:
        disabled_users.append(user)

Das ganze geht natürlich auch noch etwas eleganter mit list comprehension oder der Built-in-Funktion filter:


disabled_users = [user for user in users if user.disabled]
def is_disabled(user):
    """Returns True if user is disabled else False.
    """
    ...
disabled_users = filter(is_disabled, users)
# oder:
disabled_users = [user for user in users if is_disabled(user)]

Die oberen Beispiele erzeugen jeweils eine neue Liste. Um dies zu verhindern, arbeiten wir mit folgender Modifikation auf Referenzen des Listeninhalts:


users[:] = [user for user in users if user.disabled]

Der “[:]”-Operator erzeugt uns hier eine shallow copy der Liste.
Wer jetzt noch den Unterschied zwischen Generatoren und Iteratoren kennt, bekommt mit folgender Zeile die ultimative 🙂 Art, Listen zu filtern:


users[:] = (user for user in users if user.disabled)

Schönes Wochenende.

Eric Lippmann
Eric Lippmann
Lead Senior Developer

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er sich für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.