Nächstes kommendes Datum finden

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
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

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
Antworten