Seite 1 von 1

Nächstes kommendes Datum finden

Verfasst: Montag 15. Januar 2007, 10:18
von pr0stAta
Guten MOrgen, ich bastel gerade zum Spass an einem
kleinen Geburtstagskalender für meine IRC Bot. Bisher funktionieren
Eingaben und auch simple Ausgaben.
Die Daten sind im folgendem Format vorhanden

Code: Alles auswählen

dict = {"20.9":"gustav", "29.1":["max", "katrin"], "12.10":"willy"}
Nun dachte ich mir, als kleines Schmankerl könnte ich eine Methode
implementieren, die mir das nächste Geburtstagskind ausgibt.
Beispiel:
Am 19.9 sollte Gustav als nächstes Geburtstagskind ausgeben werden.

Nun muss ich gestehen, hatte ich mir das alles einfacher vorgestellt ;)
Meine Idee, welche ich allerdings wieder verworfen habe war, die Datum
Strings umzudrehen so dass der Monat vorne steht, diese in Float umzuwandeln
um dann das aktuelle Datum davon abzuziehen. Der kleinste Wert wäre dann
der nächste Geburtstag. Doch Probleme wie fehlende Nullen am ENde
oder Ergebnisse mit denen ein Zurückrechnen unmöglich war, brachten
mich von der Idee ab... Nun hoffe ich, das es einen typischen einfachen
Python Weg gibt um dieses Problem anzupacken. Hoffe jemand hat eine
Idee

Gruss prosta

Verfasst: Montag 15. Januar 2007, 10:22
von birkenfeld
Wie wärs mit Integern?

29.10. --> 1029 etc.

Dann gibts auch keine Rundungsfehler. Du kannst allerdings auch gleich `datetime`s nehmen.

min(item for item in dict.iteritems() if item[0] >= heute)

ist dann ein Tupel aus Datum und Namen des nächsten Geburtstages.

Außerdem wirst du Probleme bekommen, wenn die Dictionary-Werte einmal Strings und einmal Listen von Strings sind.

Verfasst: Montag 15. Januar 2007, 10:47
von pr0stAta
Hallo birkenfeld,
du hast Recht, mit Integern funktioniert es wirklich. Das Datum
muss dann zwar folgendermaßen aussehen: 10.04 anstatt 10.4 um
Probleme beim zurückwandeln zu vermeiden, aber daran werden
sich wohl alle halten können :p Hier mal mein nicht schöner,
aber funktionierender Weg:

Code: Alles auswählen

import time
d = {"20.10":["max", "kalle"], "10.04":"benno", "16.09":"gustav"}

liste = [int("".join(key.split("."))) for key in d.keys()]
datum = int(time.strftime("%d%m"))
date_list = []
for entry in liste:
  date_list.append(entry - datum)

next_bday = str(min(date_list)+ datum)
print "Naechster Geburtstag: %s.%s von %s" % (next_bday[:2],next_bday[2:], d[next_bday[:2]+"."+next_bday[2:]])
Bei Verbesserungsvorschlägen immer her damit :)
Gruß prosta

Verfasst: Montag 15. Januar 2007, 10:49
von birkenfeld
Dein Code gibt immer den ersten Geburtstag im Jahr aus, weil er vergangene Geburtstage nicht herausfiltert. Das Abziehen von "datum" ist übrigens unnötig, siehe meinen Post.

Verfasst: Montag 15. Januar 2007, 11:29
von pr0stAta
Stimmt natürlich, war ich etwas voreilig. Folgendes sollte nun
funktionieren. Natürlich muss man noch Feinheiten beachten wie
Jahreswechsel aber um sowas kümmere ich mich später :P

Code: Alles auswählen

import time
d = {"20.1":["max", "kalle"], "10.3":"benno", "16.9":"gustav"}
datum = int(time.strftime("%m%d"))

liste = ["".join(reversed(key.split("."))) for key in d.keys()]

next_bday = min(int(item) for item in liste if int(item) >= datum)
Danke für die Hilfe