The Beckoning Bull
The Beckoning Bull

Reputation: 57

Returning the value of an index in a python list based on other values

I have put the letters a-z in a list. How would I find the value of an item in the list depending on what the user typed?

For example if they type the letter a it would return c, f would return h and x would return z.

letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
newletters = []

offset = 2

userInput = input('type a string')
newvalue = chr(ord(userInput)+offset)
split = list(newvalue)
print split

the above works for a character but not for a string..help?!

Upvotes: 0

Views: 127

Answers (2)

You can try this:

>>> offset = 2
>>> aString = raw_input("digit a letter: ")
>>> aString
'a'
>>> chr(ord(aString)+offset)
'c'

documentation:


If you want to iterate over an entire string, a simple way is using a for loop. I assume the input string is always lowercase.

EDIT2: I improved the solution to handle the case when a letter is 'y' or 'z' and without "rotation" should begin a not alphabetic character, eg:

# with only offset addiction this return a non-alphabetic character
>>> chr(ord('z')+2)
'|'

# the 'z' rotation return the letter 'b'
>>> letter = "z"
>>> ord_letter = ord(letter)+offset
>>> ord_letter_rotated = ((ord_letter - 97) % 26) + 97
>>> chr(ord_letter_rotated)
'b'

The code solution:

offset = 2
aString = raw_input("digit the string to convert: ")
#aString = "abz"
newString = ""

for letter in aString:
    ord_letter = ord(letter)+offset
    ord_letter_rotated = ((ord_letter - 97) % 26) + 97
    newString += chr(ord_letter_rotated)

print newString

The output of this code for the entire lowercase alphabet:

cdefghijklmnopqrstuvwxyzab

Note: you can obtain the lowercase alphabet for free also this way:

>>> import string
>>> string.lowercase
'abcdefghijklmnopqrstuvwxyz'

See the wikipedia page to learn something about ROT13:

https://en.wikipedia.org/wiki/ROT13

Upvotes: 2

Martin Evans
Martin Evans

Reputation: 46779

What should happen for z? Should it become b?

You can use Python's maketrans and translate functions to do this as follows:

import string

def rotate(text, by):
    s_from = string.ascii_lowercase
    s_to = string.ascii_lowercase[by:] + string.ascii_lowercase[:by]
    cypher_table = string.maketrans(s_from, s_to)
    return text.translate(cypher_table)

user_input = raw_input('type a string: ').lower()
print rotate(user_input, 2)

This works on the whole string as follows:

type a string: abcxyz
cdezab

How does it work?

If you print s_from and s_to they look as follows:

abcdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyzab

maketrans creates a mapping table to map characters in s_from to s_to. translate then applies this mapping to your string.

Upvotes: 1

Related Questions