D. Kyle
D. Kyle

Reputation: 9

"IndexError: list index out of range" when performing string checking

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

Answers (2)

Daniel Trugman
Daniel Trugman

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

cs95
cs95

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

Related Questions