Reputation: 9
Ideally, I'd like to be able to prompt users for "Small" or "S", "Medium" or "M" and "Large" or "L" when determining prices for drinks. This is all case insensitive, so "s" or "smaLL" is good, etc. If i input just an 'M', I get an error for an index code out of range, and it computes as a small. A large gives me a medium. Help?
print("Ie. 'S', 'M', 'L', 'Small', 'Medium, 'Large'" +
" or any variations in their letter case sensitivity will work.")
beverageSize = str(input("Input your desired size: "))
print("")
if len(beverageSize) > 1 and len(beverageSize) < 5:
exit(print("Error with choice of beverage input."))
elif beverageSize.startswith("S") or beverageSize.startswith("s") and\
beverageSize is beverageSize.isalpha() and len(beverageSize) == 0 or len(beverageSize) == 4 or\
beverageSize[0] == "S" or beverageSize[0] == "s" and\
beverageSize[1] == "M" or beverageSize[1] == "m" or beverageSize[1] == "" and\
beverageSize[2] == "A" or beverageSize[2] == "a" or beverageSize[2] == "" and\
beverageSize[3] == "L" or beverageSize[3] == "l" or beverageSize[3] == "" and\
beverageSize[4] == "L" or beverageSize[4] == "l" or beverageSize[4] == "" and\
len(beverageSize) != 5:
beverageSize = SMALL_SIZE
print("SMALl")
elif beverageSize.startswith("M") or beverageSize.startswith("m") and\
beverageSize is beverageSize.isalpha() and\ len(beverageSize) == 0 or len(beverageSize) == 5 or \
beverageSize[0] == "M" or beverageSize[0] == "m" and\
beverageSize[1] == "E" or beverageSize[1] == "e" or beverageSize[1] == "" and\
beverageSize[2] == "D" or beverageSize[3] == "d" or beverageSize[3] == "" and\
beverageSize[3] == "I" or beverageSize[3] == "i" or beverageSize[3] == "" and\
beverageSize[4] == "U" or beverageSize[4] == "u" or beverageSize[4] == "" and\
beverageSize[5] == "M" or beverageSize[5] == "m" or beverageSize[5] == "":
beverageSize = MEDIUM_SIZE
print("MEDIUM")
Upvotes: 0
Views: 194
Reputation: 8501
Firs of all, your program won't work because this will always be true for allowed values:
if len(beverageSize) > 1 and len(beverageSize) < 5:
exit(print("Error with choice of beverage input."))
Then, give yourself a break and avoid all lower/uppercase checks by just using this before comparing stuff:
bevarageSize = bevarageSize.lower()
Now start comparing:
if (beverageSize == 's' or bevarageSize == 'small'):
print 'small'
elif (beverageSize == 'm' or bevarageSize == 'medium'):
print 'medium'
elif (beverageSize == 'l' or bevarageSize == 'large'):
print 'large'
Or even better, using real Python style:
if (beverageSize in ('s', 'small')):
print 'small'
elif (beverageSize in ('m', 'medium')):
print 'medium'
elif (beverageSize in ('l', 'large')):
print 'large'
Upvotes: 0
Reputation: 402653
There are smarter ways for testing the value of variables in python. One method using if-else
conditions has already been suggested in the comments. Here's another short, concise method using a dict
:
size_dict = {'s' : SMALL_SIZE, 'small' : SMALL_SIZE,
'm' : MEDIUM_SIZE,'medium' : MEDIUM_SIZE,
'l' : LARGE_SIZE, 'large' : LARGE_SIZE}
beverageSize = size_dict.get(beverageSize.lower(), 'Invalid Size')
This uses dict.get
to extract values associated with your input. If the user entered a word that does not exist as a key in the dictionary, then beverageSize
is assigned the value Invalid Size
.
Upvotes: 2