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

StackOverflow https://stackoverflow.com/questions/18692166

Domanda

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

È stato utile?

Soluzione

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.

Altri suggerimenti

letter = input()
x = ord(letter)
if x>64:
    print x-64
else:
    print "invalid"

more compact wit turnary operator

x = ord(input())
print (x-64 if x>64 else 'invalid')

Without giving away the full solution: You could [1] Check first if x is not a capital letter (check out string.uppercase), and then [2] (Now that you know x is indeed a capital letter), return the ord(x) - n where n is the order at which the capital letters start (try ord('A') - 1).

Hope that helps!

ord(letter)-64 if 65<=ord(letter)<=90 else 'Invalid'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top