Die Freuden von itertools.groupby()

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Montag 10. März 2008, 13:49

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(...)
Zuletzt geändert von lutz.horn am Montag 10. März 2008, 14:30, insgesamt 1-mal geändert.
https://www.xing.com/go/invite/18513630.6a91d4
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Montag 10. März 2008, 14:23

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).
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Montag 10. März 2008, 14:31

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!
https://www.xing.com/go/invite/18513630.6a91d4
Antworten