#! /usr/bin/env python3 # -*- coding: utf-8 -*- bdays = """\ 23-8-1754 Louis XVI 24-8-1948 Jean-Michel Jarre 15-6-1943 Johnny Hallyday 28-9-1934 Brigitte Bardot """ from datetime import date def str2date(str_date): d, m, y = str_date.split('-') return (int(y), int(m), int(d)) def find_next(bdays, md): if not bdays: return [] match = [] for l in bdays: next_date = (l[0][1], l[0][2]) if len(match): # Check if there is another bday the same day if next_date == (match[0][0][1], match[0][0][2]): match.append(l) else: break elif next_date >= md: match.append(l) return match if len(match) else find_next(bdays, (0,0)) if __name__ == "__main__": converted = [] for l in bdays.splitlines(): tokens = l.strip().split() if tokens: converted.append((str2date(tokens[0]), ' '.join(tokens[1:]))) # Sort by month and day sorted_bdays = sorted(converted, key=lambda d: (d[0][1], d[0][2])) today = date.today() md = (today.month, today.day) next_bdays = find_next(sorted_bdays, md) for bday in next_bdays: bmd = (bday[0][1], bday[0][2]) if bmd == md: print(f"* Aujourd'hui : Anniversaire de {bday[1]} ({today.year-bday[0][0]} ans)\n") else: isnextyear = bmd < md dt = date(today.year if not isnextyear else today.year+1, bmd[0], bmd[1]) - today print(f"* Anniversaire de {bday[1]} dans {dt.days} jours ({today.year-bday[0][0]} ans)\n")