Python 3.x 检查生日是否在7天内
我目前有两本字典是这样设置的Python 3.x 检查生日是否在7天内,python-3.x,Python 3.x,我目前有两本字典是这样设置的 D = {'Jan': {'days': 31, 'nextmo': 'Feb', 'prevmo': 'Dec'}, 'Feb': {'days': 29, 'nextmo': 'Mar', 'prevmo': 'Jan'}, 'Mar': {'days': 31, 'nextmo': 'Apr', 'prevmo': 'Feb'}, 'Apr': {'days': 30, 'nextmo': 'May', 'prevmo': 'Mar'}, 'May'
D = {'Jan': {'days': 31, 'nextmo': 'Feb', 'prevmo': 'Dec'},
'Feb': {'days': 29, 'nextmo': 'Mar', 'prevmo': 'Jan'},
'Mar': {'days': 31, 'nextmo': 'Apr', 'prevmo': 'Feb'},
'Apr': {'days': 30, 'nextmo': 'May', 'prevmo': 'Mar'},
'May': {'days': 31, 'nextmo': 'Jun', 'prevmo': 'Apr'},
'Jun': {'days': 30, 'nextmo': 'Jul', 'prevmo': 'May'},
'Jul': {'days': 31, 'nextmo': 'Aug', 'prevmo': 'Jun'},
'Aug': {'days': 31, 'nextmo': 'Sep', 'prevmo': 'Jul'},
'Sep': {'days': 30, 'nextmo': 'Oct', 'prevmo': 'Aug'},
'Oct': {'days': 31, 'nextmo': 'Nov', 'prevmo': 'Sep'},
'Nov': {'days': 30, 'nextmo': 'Dec', 'prevmo': 'Nov'},
'Dec': {'days': 31, 'nextmo': 'Jan', 'prevmo': 'Jan'},}
birthdays = {'John': ('Mar', 23, '1989'),
'Johns_twin': ('Mar', 28, '1989'),
'Susan': ('Feb', 16, '1989'),
'Alan': ('Sep', 4, '1989'), 'Kevin': ('Dec', 23, '1989'), 'Murad':
('Jan', 3, '1989'), 'Sandeep': ('Apr', 2, '1989'), 'James': ('Apr', 3,
'1989'), 'Karen': ('Apr', 2, '1989'), 'Wiktoria': ('Jul', 14, '1989'),
'Rogan': ('Jun', 29, '1989'), 'Fraser': ('Jan', 4, '1989'), 'Cameron':
('Oct', 1, '1989')}
{'John': ('Mar', 23, '1989'), 'Johns_twin': ('Mar', 28, '1989')
基本上,如果有人输入日期“Apr”“2”,我希望它返回7天范围内的所有生日(3月26日->4月9日)
我的大部分代码都在工作,并且知道如何完成它,但是我的工作方式似乎非常长。是否有更简单的解决方案(最好不必导入datetime或任何其他模块)
我从函数中得到的代码如下。这是在进行手动检查,但要使其适用于所有场景,代码的长度可能需要是此代码长度的2-3倍
def adder(bday_month_in,bday_day_in):
date_check1 = D[bday_month_in]['prevmo']
if 7 <= bday_day_in <= 21:
max_bday = bday_day_in + 7
min_bday = bday_day_in - 7
print('The desired range is between', min_bday, 'and',max_bday, "of", bday_month_in)
for key, (valX, valY, valZ) in birthdays.items():
if valX == bday_month_in:
if min_bday <= valY <= max_bday:
print(key, (valX, valY, valZ))
else:
if bday_day_in <= 6: #Apr 2
adder = 7 - bday_day_in #5
prev_mo = D[bday_month_in]['prevmo'] #month_max = Mar
prev_date = D[prev_mo]['days'] - adder #days in mar (31) - 5 = 26
print(prev_mo,prev_date)
future_date = bday_day_in + 7
print('The desired range is between', prev_date, "of", prev_mo,'and',future_date,bday_month_in)
for key, (valX, valY, valZ) in birthdays.items():
if future_date > valY and valX == bday_month_in:
print(key, (valX, valY, valZ))
if valY > prev_date and valX == prev_mo:
print(key, (valX, valY, valZ))
if bday_day_in => 21: #Apr 2
adder = 7 - bday_day_in #5
prev_mo = D[bday_month_in]['prevmo'] #month_max = Mar
prev_date = D[prev_mo]['days'] - adder #days in mar (31) - 5 = 26
print(prev_mo,prev_date)
future_date = bday_day_in + 7
print('The desired range is between', prev_date, "of", prev_mo,'and',future_date,bday_month_in)
for key, (valX, valY, valZ) in birthdays.items():
if future_date > valY and valX == bday_month_in:
print(key, (valX, valY, valZ))
if valY > prev_date and valX == prev_mo:
print(key, (valX, valY, valZ))
#print('ValY',valY,valZ)
# print('prev_date',prev_date)
# print('future_date',future_date)
# if future_date <= valY <= prev_date:
else:
valuer_max = days_in_that_month - 7
month_max = D[bday_month_in]['prevmo'] # 'Mar'
print(valuer_max,month_max)
def加法器(日月英寸,日英寸):
日期检查1=D[b日期月份]['prevmo']
如果7个上一个日期和valX==上一个月:
打印(键,(valX,valY,valZ))
#打印('ValY',ValY,valZ)
#打印('上一个日期',上一个日期)
#打印('未来日期',未来日期)
#如果future_date在没有日期的情况下执行此任务,则api并非微不足道,因为结果取决于是否存在闰日(2月29日)
这也意味着,为了获得正确的结果,我们需要知道我们所处的年份。例如,如果参考日为3月2日,则在非闰年中,2月23日在7天范围内,但在闰年中,它不在7天范围内
您确实应该使用datetime
包,并将日期转换为此类datetime
对象
下面是代码的外观:
import datetime
def around(birthdays, day, maxdays):
result = []
for name, bday in birthdays.items():
try:
mappedbday = bday.replace(year=day.year)
except ValueError: # 29 February cannot be mapped to non-leap year
mappedbday = bday.replace(year=day.year, day=28) # Choose 28-Feb instead
if abs((mappedbday - day).days) <= maxdays:
result.append((name, str(mappedbday)))
return result
# Encode birthday values as datetime objects
birthdays = {
'John': datetime.date(1989, 3, 23),
'Johns_twin': datetime.date(1989, 3, 28),
'Susan': datetime.date(1989, 2, 16),
'Alan': datetime.date(1989, 9, 4),
'Kevin': datetime.date(1989, 12, 23),
'Murad': datetime.date(1989, 1, 3),
'Sandeep': datetime.date(1989, 4, 2),
'James': datetime.date(1989, 4, 3),
'Karen': datetime.date(1989, 4, 2),
'Wiktoria': datetime.date(1989, 7, 14),
'Rogan': datetime.date(1989, 6, 29),
'Fraser': datetime.date(1989, 1, 4),
'Cameron': datetime.date(1989, 10, 1)
}
# Example:
month = 'Apr'
day = 2
# Convert month's abbreviated name to month number:
monthnum = datetime.datetime.strptime(month,'%b').month
# Create a date object: we need a year, as result may differ in leap year
refdate = datetime.date(2018, monthnum, day)
print(around(birthdays, refdate, 7))
日期仅使用str
函数格式化,但您当然可以选择不同的格式。如果不使用日期/时间模块,您必须编写逻辑来处理闰年。对我来说似乎效率不高。是否有不使用datetime
的具体原因?它的存在正是为了帮助疯狂的日期和时间!主要原因是我没有一年的时间。最初提供的词典是name/month/day。我在尝试实现datetime时添加了年份,但最终返回到上面的方法。无论datetime如何使用,我都希望得到指导,因为我无法让它按预期工作
[('Johns_twin', '2018-03-28'),
('Sandeep', '2018-04-02'),
('James', '2018-04-03'),
('Karen', '2018-04-02')]