List: Suche mit mehreren Kriterien

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
OttoPython
User
Beiträge: 47
Registriert: Montag 23. April 2012, 14:14

Hi Leute,

ich brauch mal n bisschen Hilfe für einen Grundansatz.

1) Ich habe möchte eine Filelist über den Inhalt eines bestimmten Verzeichnisses erstellen.
- erledigt und läuft ohne probleme
2) in der erstellten Liste, sind nun die Files. Diese Files sind mit dem erstellungsdatum beschriftet und chronologisch fortlaufend. Ich würde nun gern jedes Jahres die erste Datei und die Letzte Datei mir ausgeben lassen. Wie geh ich da ran?
Ich weiß nicht wie ich, wenn ich nach einer bestimmte Sache suche, mir exakt diese Stelle ausgeben lasse. Und wie ich dann das ganze Weg schreibe. Zum wegschreiben n dict() vllt?

Beispiel:

Code: Alles auswählen

20080112
20080125
20080126
20090601
20090805
20090909
dann würde ich gern eine ausgabe von

Code: Alles auswählen

20080112 20080126
20090601 20090909
erhalten.

beste grüße
"Im Burnout steckt viel Arbeit drin" -Lysander
BlackJack

@OttoPython: 1) Sicherstellen dass die Daten wirklich sortiert sind — `os.listdir()` garantiert das *nicht*, auch wenn es oft so aussieht als wenn die Namen immer sortiert sind!

2) `itertools.groupby()` zum Gruppieren der Jahre verwenden.

3) Erstes und letztes Element aus den Iteratoren nehmen.

4) Randfälle beachten. Was passiert zum Beispiel wenn es nur einen Namen für ein Jahr gibt, und was soll(te) in dem Fall passieren.

Edit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from itertools import groupby


def main():
    filenames = [
        '20080112',
        '20080125',
        '20080126',
        '20090601',
        '20090805',
        '20090909',
    ]
    
    filenames.sort()
    for key, group in groupby(filenames, lambda fn: fn[:4]):
        group = list(group)
        print key, '->', group[0], group[-1]


if __name__ == '__main__':
    main()
Antworten