Search code examples
pythonif-statementfor-loopchrord

Python Efficiency - Better version than multiple if elif statements - use a for loop - chr ord conversions?


I'm taking an intro to an online Python course and here's the problem description.

Write a program which does the reverse of the example above: it should take a character as input and output the corresponding number (between 1 and 26). Your program should only accept capital letters. As error-checking, print invalid if the input is not a capital letter.

Can someone reply with a more efficient way of writing the following?

letter = input()
x = ord(letter)
if x >= ord('A') and x == 65:
   print(1)
elif x >= ord('A') and x == 66:
   print(2)
elif x >= ord('A') and x == 67:
   print(3)
elif x >= ord('A') and x == 68:
   print(4)
elif x >= ord('A') and x == 69:
   print(5)
elif x >= ord('A') and x == 70:
   print(6)
elif x >= ord('A') and x == 71:
   print(7)
elif x >= ord('A') and x == 72:
   print(8)


else:
   print("invalid")

I was thinking of some kind of for loop. I started several versions of for loops, but can't figure out how to handle the iterator and correspond it to the increasing asci value. Thanks! This chr ord chart could help


Solution

  • You don't need any loops to solve this. Firstly, realize that you repeat the first test in each elif, so let's pull that right out to the top:

    if x < ord('A')
    

    Now, there are only a limited range of possible values for our x. In fact, the valid values for x also include x < ord('A') so we can remove that test:

    if x < 65 or x > 72:
        print("invalid")
    

    Ok, now we only have valid results left. There's actually a very simple formula for what you print: it ends up being x - 64. So that can go in the else part:

    else:
        print(x - 64)
    

    So the whole thing ends up being:

    x = ord(letter)
    if x < 65 or x > 72:
        print('invalid')
    else:
        print(x - 64)
    

    Note that the capital letters span more than this. However, the fix should be fairly simple.