Related
So I had to write some code for my class that takes a date input and based on the month/day outputs the season. When I use "in" on the 10th line I don't get any output, not even 'Invalid' the only time I get an output is when is use 'not in'. I'm confused why that happens if anyone could explain it to me I would really appreciate it. Thank you.
input_month = input()
input_day = int(input())
month_winter = ['January', 'February', 'March', 'December']
month_spring = ['March', 'April', 'May', 'June']
month_summer = ['June', 'July', 'August', 'September']
month_autumn = ['September', 'October', 'November', 'December']
month_list = [month_winter, month_spring, month_summer, month_autumn]
def month_check():
if input_month not in month_list[0:]:
return which_month()
def which_month():
if input_month in month_winter[0:]:
which_dates1()
elif input_month in month_summer[0:]:
which_dates2()
elif input_month in month_spring[0:]:
which_dates3()
elif input_month in month_autumn[0:]:
which_dates4()
else:
print('Invalid')
def which_dates1():
if input_month in month_winter[0:2]:
if 0 < input_day < 32:
print('Winter')
else:
print('Invalid')
elif input_month in month_winter[2:3]:
if 1 <= input_day <= 19:
print('Winter')
else:
print('Invalid')
elif input_month in month_winter[3:]:
if 21 <= input_day <= 31:
print('Winter')
else:
print('Invalid')
def which_dates2():
if input_month in month_spring[0:1]:
if 20 <= input_day < 32:
print('Spring')
elif input_month in month_spring[1:3]:
if 1 <= input_day <= 31:
print('Spring')
elif input_month in month_spring[3:]:
if 1 <= input_day <= 20:
print('Spring')
else:
print('Invalid')
def which_dates3():
if input_month in month_summer[0:1]:
if 21 <= input_day < 32:
print('Summer')
elif input_month in month_summer[1:3]:
if 1 <= input_day < 32:
print('Summer')
elif input_month in month_winter[3:]:
if 1 <= input_day <= 21:
print('Summer')
else:
print('Invalid')
def which_dates4():
if input_month in month_autumn[0:1]:
if 22 <= input_day < 32:
print('Autumn')
elif input_month in month_autumn[1:3]:
if 1 <= input_day < 32:
print('Autumn')
elif input_month in month_autumn[3:]:
if 1 <= input_day <= 20:
print('Autumn')
else:
print('Invalid')
month_check()
You are trying to find the input_month in a 2 dimensional list i.e. month_list
If you check:
month_winter = ['January', 'February', 'March', 'December']
month_spring = ['March', 'April', 'May', 'June']
month_summer = ['June', 'July', 'August', 'September']
month_autumn = ['September', 'October', 'November', 'December']
month_list = [month_winter, month_spring, month_summer, month_autumn]
print(month_list)
This will output:
[['January', 'February', 'March', 'December'], ['March', 'April', 'May', 'June'], ['June', 'July', 'August', 'September'], ['September', 'October', 'November', 'December']]
So as you can see all the values are list and not a string as you are expecting in line 10 so in operator wont work.
Write a program to read dates from input, one date per line. Each date's format must be as follows: March 1, 1990. Any date not following that format is incorrect and should be ignored. The input ends with -1 on a line alone. Output each correct date as: 3/1/1990.
Hint: Use string[start:end] to get a substring when parsing the string and extracting the date. Use the split() method to break the input into tokens.
Ex: If the input is:
March 1, 1990
April 2 1995
7/15/20
December 13, 2003
-1
then the output is:
3/1/1990
12/13/2003
This is what I have to start with and I am lost. Help?
def get_month_as_int(monthString):
if monthString == 'January':
month_int = 1
elif monthString == 'February':
month_int = 2
elif monthString == 'March':
month_int = 3
elif monthString == 'April':
month_int = 4
elif monthString == 'May':
month_int = 5
elif monthString == 'June':
month_int = 6
elif monthString == 'July':
month_int = 7
elif monthString == 'August':
month_int = 8
elif monthString == 'September':
month_int = 9
elif monthString == 'October':
month_int = 10
elif monthString == 'November':
month_int = 11
elif monthString == 'December':
month_int = 12
else:
month_int = 0
return month_int
user_string = input()
# TODO: Read dates from input, parse the dates to find the one
# in the correct format, and output in m/d/yyyy format
import datetime
inputs = []
result = []
#read the inputs
date = input()
inputs.append(date)
while not date == "-1":
date = input()
inputs.append(date)
#check if the input is in the correct format and convert it.
for date_text in inputs:
try:
date_text = datetime.datetime.strptime(date_text,"%d %B, %Y")
result.append(date_text.strftime("%d/%m/%Y"))
except ValueError:
pass
print(*result, sep = "\n")
s=0
d={'january':1,
'february':2,
'march':3,
'april':4,
'may':5,
'june':6,
'july':7,
'august':8,
'september':9,
'october':10,
'november':11,
'december':12}
while s!='-1':
s=input()
if "," in s:
s = s.split(",")
ar = s[0].split(" ")
if len(ar)<2:
continue
month, date = ar[0], ar[1]
year = s[1].strip()
if d.get(month.lower()):
print("{}/{}/{}".format(date, d[month.lower()], year))
I have made this program using elif statements and am just curious on how it would be done using nested ifs instead.
The user has to input a number and the program will tell them which month it is and how many days are in it.
month_num = int(input("Enter the number of a month (Jan = 1) : "))
if month_num == 1:
print(month_num, "is Feburary, and has 29 days.")
elif month_num == 2:
print(month_num, "is January, and has 31 days.")
elif month_num == 3:
print(month_num, "is March, and has 31 days.")
elif month_num == 4:
print(month_num, "is April, and has 30 days.")
elif month_num == 5:
print(month_num, "is May, and has 31 days.")
elif month_num == 6:
print(month_num, "is June, and has 30 days.")
elif month_num == 7:
print(month_num, "is July, and has 31 days.")
elif month_num == 8:
print(month_num, "is August, and has 31 days.")
elif month_num == 9:
print(month_num, "is September, and has 30 days.")
elif month_num == 10:
print(month_num, "is october, and has 31 days.")
elif month_num == 11:
print(month_num, "is November, and has 30 days.")
elif month_num == 12:
print(month_num, "is december, and has 31 days.")
else:
print(month_num, "Is not a valid number")
Neither are a good solution. You'd be better off creating a dictionary.
Assuming f-strings are available (Python >= 3.6). If not these can be easily converted to use .format:
month_num = int(input("Enter the number of a month (Jan = 1) : "))
d = {1: ('January', 31),
2: ('February', 29),
...
}
try:
month_name, num_of_days = d[month_num]
print(f'{month_num} is {month_name}, and has {num_of_days} days')
except KeyError:
print(month_num, "Is not a valid number")
Also note that February does not always have 29 days.
You can use calendar, i.e.:
import calendar as cal
from datetime import date
m = int(input("Enter the number of a month (Jan = 1) : "))
if m in range(1,13):
print(f"{m} is {cal.month_name[m]} and has {cal.monthrange(date.today().year, m)[1]} days.")
1 is January and has 31 days.
2 is February and has 29 days.
3 is March and has 31 days.
4 is April and has 30 days.
5 is May and has 31 days.
6 is June and has 30 days.
7 is July and has 31 days.
8 is August and has 31 days.
9 is September and has 30 days.
10 is October and has 31 days.
11 is November and has 30 days.
12 is December and has 31 days.
Demo
There might be a bug in this lesson.
I'm trying to move forward without needing to watch the answer videos for the daysBetweenDates quiz.
Long story short:
I figured out the code and it works for all test cases, except one.
The error was odd. The difference between the number of days between dates I got and the answer according to Udacity. My notion is that if there's error in my code, the difference between the answer I got and Udacity's expected answer would be more than 1 because the error should be recurring.
I tried to compute the number of days between dates using a different approach. I got the number my program computed.
So the question is, is the number of days between dates between 1900,1 ,1 and 1999,12, 31 really 36523(Udacity's answer) or 36524(my answer)
Here's my complete code
I recommend you try it on your interpreter to check if Udacity's answer for the last test case is correct.
# Credit goes to Websten from forums
#
# Use Dave's suggestions to finish your daysBetweenDates
# procedure. It will need to take into account leap years
# in addition to the correct number of days in each month.
number_of_days_in_month = 30
def nextDay(year, month, day):
"""Simple version: assume every month has 30 days"""
number_of_days_in_month = setDaysInMonth(month, year)
if day < number_of_days_in_month:
return year, month, day + 1
else:
if month == 12:
return year + 1, 1, 1
else:
return year, month + 1, 1
def dateIsBefore(year1, month1, day1, year2, month2, day2):
"""Returns True if year1-month1-day1 is before year2-month2-day2. Otherwise, returns False."""
if year1 < year2:
return True
if year1 == year2:
if month1 < month2:
return True
if month1 == month2:
return day1 < day2
return False
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
"""Returns the number of days between year1/month1/day1
and year2/month2/day2. Assumes inputs are valid dates
in Gregorian calendar."""
# program defensively! Add an assertion if the input is not valid!
assert not dateIsBefore(year2, month2, day2, year1, month1, day1)
number_of_days_between_dates = 0
while dateIsBefore(year1, month1, day1, year2, month2, day2):
year1, month1, day1 = nextDay(year1, month1, day1)
number_of_days_between_dates += 1
print number_of_days_between_dates
return number_of_days_between_dates
def setDaysInMonth(month1, year1):
if isLeapYear(year1) == False:
if month1 == 1:
number_of_days_in_month = 31
if month1 == 3:
number_of_days_in_month = 31
if month1 == 5:
number_of_days_in_month = 31
if month1 == 7:
number_of_days_in_month = 31
if month1 == 8:
number_of_days_in_month = 31
if month1 == 10:
number_of_days_in_month = 31
if month1 == 12:
number_of_days_in_month = 31
if month1 == 4:
number_of_days_in_month = 30
if month1 == 6:
number_of_days_in_month = 30
if month1 == 9:
number_of_days_in_month = 30
if month1 == 11:
number_of_days_in_month = 30
if month1 == 2:
number_of_days_in_month = 28
return number_of_days_in_month
else:
if month1 == 1:
number_of_days_in_month = 31
if month1 == 3:
number_of_days_in_month = 31
if month1 == 5:
number_of_days_in_month = 31
if month1 == 7:
number_of_days_in_month = 31
if month1 == 8:
number_of_days_in_month = 31
if month1 == 10:
number_of_days_in_month = 31
if month1 == 12:
number_of_days_in_month = 31
if month1 == 4:
number_of_days_in_month = 30
if month1 == 6:
number_of_days_in_month = 30
if month1 == 9:
number_of_days_in_month = 30
if month1 == 11:
number_of_days_in_month = 30
if month1 == 2:
number_of_days_in_month = 29
return number_of_days_in_month
def isLeapYear(year1):
if year1 % 4 == 0:
return True
return False
def numberOfLeapYears(year1, year2):
number_of_leap_years = 0
while year1 < year2:
if year1 % 4 == 0:
number_of_leap_years += 1
year1 += 1
else:
year1 += 1
#print "number of leap years: " + str(number_of_leap_years)
return number_of_leap_years
def numberOfNonLeapYears(year1, year2):
number_of_non_leap_years = 0
while year1 < year2:
if year1 % 4 == 0:
year1 += 1
else:
number_of_non_leap_years += 1
year1 += 1
#print "number of non leap years: " + str(number_of_non_leap_years)
return number_of_non_leap_years
def numberOfDays(year1, year2):
number_of_leap_years = numberOfLeapYears(year1, year2)
print number_of_leap_years
number_of_non_leap_years = numberOfNonLeapYears(year1, year2)
print number_of_non_leap_years
number_of_days = 0
number_of_days = number_of_leap_years * 366 + number_of_non_leap_years * 365
#print number_of_days
return number_of_days
def test():
test_cases = [((2012,1,1,2012,2,28), 58),
((2012,1,1,2012,3,1), 60),
((2011,6,30,2012,6,30), 366),
((2011,1,1,2012,8,8), 585 ),
((1900,1,1,1999,12,31), 36523),
((1900,1,1,1910,1,1), 3653)]
for (args, answer) in test_cases:
result = daysBetweenDates(*args)
if result != answer:
print "Test with data:", args, "failed"
else:
print "Test case passed!"
test()
#print isLeapYear(1900)
#print 366*3 + 365*7
#print numberOfLeapYears(1900, 1999)
#print numberOfNonLeapYears(1900, 1999)
print numberOfDays(1900, 2000)
You are using a naive test for Leap Year ( %4). But there are additional rules to leap years.
Leap year is any year evenly divisible by 4, unless it is divisible by 100 (then it is not a leap year), unless it is divisible by 400 (Then it is a leap year).
Thus 1500, 1700, 1800, 1900 were not leaps years but 1600 and 2000 were leap years.
A simple Python version:
def is_leap_year(year):
if year % 400 == 0:
return True
if year % 4 == 0 and not year % 100 == 0:
return True
return False
I have a problem in these two casesprint daysBetweenDates(2011, 1, 1, 2012, 8, 8)
print daysBetweenDates(1900,1,1, 1999,12, 31)when I put them with the other test cases I got a wrong answer by 1 day extra and sometimes by 2 days.sometimes one of them give me the right answer but it also appears asTest with data:(2011, 1, 1, 2012,8,8)failed
Test with data: (1900, 1, 1, 1999, 12, 31) failed but when I test each case alone i got the right answer.
daysofmonths = [ 0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def leap_year(year):
leap_day = 366
common_day = 365
if year % 4 != 0:
return common_day
elif year % 100 != 0:
return leap_day
elif year % 400 !=0:
return common_day
else:
return leap_day
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
#code for same year
if year1 == year2:
if month1 == month2:
return day2 - day1
days = daysofmonths[month1] - day1
month1 = month1 + 1
while month1 < month2:
if leap_year(year1) == 366:
daysofmonths[2] = 29
days = days + daysofmonths[month1]
month1 = month1 + 1
return days + day2
################################################
days = daysofmonths[month1] - day1
month1 = month1 + 1
while month1 <= 12:
if leap_year(year1) == 366:
daysofmonths[2] = 29
days = days + daysofmonths[month1]
month1 = month1 + 1
#print days
year1 = year1 + 1
###########################################################
days = days + day2
month2 = month2 - 1
while month2 >= 1:
if leap_year(year2) == 366:
daysofmonths[2] = 29
days = days + daysofmonths[month2]
month2 = month2 - 1
#print days
year2 = year2 - 1
###########################################################
while year1 <= year2:
days = days + leap_year(year1)
year1 = year1 + 1
return days
print daysBetweenDates(2011, 1, 1, 2012, 8, 8)
print daysBetweenDates(1900,1,1, 1999,12, 31)
def test():
test_cases = [((2012,1,1,2012,2,28), 58),
((2012,1,1,2012,3,1), 60),
((2011,6,30,2012,6,30), 366),
((2011,1,1,2012,8,8), 585 ),
((1900,1,1,1999,12,31), 36523)]
for (args, answer) in test_cases:
result = daysBetweenDates(*args)
if result != answer:
print "Test with data:", args, "failed"
else:
print "Test case passed!"
test()
when you do:
daysofmonths[2] = 29
it changes the element in the list, which then is used for every subsequent call, if you added print(daysofmonths[2]) in between the test cases you would see that it is always 29 after the first case that needs to check February, so instead of conditionally changing the list with:
if leap_year(year1) == 366:
daysofmonths[2] = 29
days = days + daysofmonths[month1]
just conditionally add to days:
if leap_year(year1) == 366 and month1 == 2:
days = days + 29
else:
days = days + daysofmonths[month1]
then do the same thing lower down with year2 and month2 (I would highly recommend you separate your code into more functions as a lot of it is very repetitive)
This is the only post I found here on this particular problem so I thought I would share my solution.
#days in the months of a non leap year
daysOfMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
#determine if a year is a leap year
def is_leap_year(year1):
year = True
if year1 % 4 != 0:
year = False
elif year1 % 100 != 0:
year = True
elif year1 % 400 != 0:
year = False
else: year = True
return year
#returns the days in the given month of the given year
#I was trying to do something similar to the OP until I read this post
def days_in_month(year, month):
days = 0
if is_leap_year(year) and month == 2:
days += 29
else:
days += daysOfMonths[month - 1]
return days
#itterates through each month starting at year1 month1
#up to but not including month2 of year2 and
#returns the total number of days in that period
def total_days(year1, month1, year2, month2):
days = 0
while year1 < year2 or month1 < month2:
days += days_in_month(year1, month1)
month1 += 1
if month1 == 13:
year1 += 1
month1 = 1
return days
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
days = total_days(year1, month1, year2, month2)
#because I included the beginning month I have to subtract day1
#because I did not include the final month I have to add day2
return days - day1 + day2
#I used print statements here to troubleshoot
#print days_in_month(2012, 1)
#print daysBetweenDates(2012, 1, 1, 2012, 2, 28)
#print daysBetweenDates(2012, 1, 1, 2012, 3, 1)
#print daysBetweenDates(2011,6,30,2012,6,30)
#print daysBetweenDates(2011,1,1,2012,8,8)
#print daysBetweenDates(1900,1,1,1999,12,31)
def test():
test_cases = [((2012,1,1,2012,2,28), 58),
((2012,1,1,2012,3,1), 60),
((2011,6,30,2012,6,30), 366),
((2011,1,1,2012,8,8), 585 ),
((1900,1,1,1999,12,31), 36523)]
for (args, answer) in test_cases:
result = daysBetweenDates(*args)
if result != answer:
print "Test with data:", args, "failed"
else:
print "Test case passed!"
test()