Seite 1 von 1

Die Freuden von itertools.groupby()

Verfasst: Montag 10. März 2008, 13:49
von lutz.horn
Um eine Liste von Objekte nach einem gemeinsamen Merkmal zu gruppieren, habe ich neulich itertools.groupby() entdeckt. Wegen solcher Dinge liebe ich Python!

Code: Alles auswählen

import itertools
import pprint

class Movie(object):
    def __init__(self, title, sortingtitle):
        self.title = title
        self.sortingtitle = sortingtitle

    def __repr__(self):
        return self.title

movies = [Movie("Terminator 2", "Terminator 2"),
          Movie("Das Leben der Anderen", "Leben der Anderen, Das"),
          Movie("Das Leben ist ein langer ruhiger Fluss", "Leben ist ein langer ruhiger Fluss"),
          Movie("Der Vater der Braut", "Vater der Braut, Der")]
movies.sort(key=lambda m: m.sortingtitle)

grouped_movies = [(k, list(g)) for k, g in
                  itertools.groupby(movies, lambda x: x.sortingtitle[0].upper())]

pprint.pprint(grouped_movies)
# =>
# [('L', [Das Leben der Anderen, Das Leben ist ein langer ruhiger Fluss]),
#  ('T', [Terminator 2]),
#  ('V', [Der Vater der Braut])]
Edit: movies.sort(key=...) statt movies.sort(...)

Verfasst: Montag 10. März 2008, 14:23
von Y0Gi
Jap, das hat mir auch schon ab und zu sehr geholfen.

Übrigens, hast du dir mal das `key`-Argument für Sortierfunktionen angesehen? Das soll sogar deutlich schneller sein als `cmp`, weil die Funktion nur einmal pro Element und nicht zweimal bei jedem Vergleich ausgeführt wird (iirc).

Verfasst: Montag 10. März 2008, 14:31
von lutz.horn
Y0Gi hat geschrieben:Übrigens, hast du dir mal das `key`-Argument für Sortierfunktionen angesehen? Das soll sogar deutlich schneller sein als `cmp`, weil die Funktion nur einmal pro Element und nicht zweimal bei jedem Vergleich ausgeführt wird (iirc).
Guter Hinweis, vielen Dank!