JR34
JR34

Reputation: 109

convert string of numbers to letters python

I need to convert a string of numbers into a string of letters to form words Example: if the input to your program is 1920012532082114071825463219200125320615151209190846 it should return stay hungry. stay foolish.

I have this so far:

def number ():
output = []
input = raw_input ("please enter a string of numbers: ")
for number in input:
    if number <= 26:
        character = chr(int(number+96))
        output.append(character)
    else:
        character = chr(int(number))
        output.append(character)
print output

I need it to somehow determine that every two numbers equals one letter. I have a program that does the reverse of this, outputs numbers when given letter. this is what that looks like:

def word ():
output = []
input = raw_input("please enter a string of lowercase characters: ")
for character in input:
    number = ord(character) - 96
    if number > 0:
        if number <= 9:
            output.append('0' + str(number))
        else:
            output.append(str(number))
    else:
        output.append(str(number + 96))
print ''.join(output)

Thanks for the help

Upvotes: 1

Views: 6052

Answers (4)

Omar Awad
Omar Awad

Reputation: 1

def remove(string): 

    return string.replace(" ", "")

dict = 

{'a': '1',
    'b': '2',
    'c': '3',
    'd': '4',
    'e': '5',
    'f': '6',
    'g': '7',
    'h': '8',
    'i': '9',
    'j': '10',
    'k': '11',
    'l': '12',
    'm': '13',
    'n': '14',
    'o': '15',
    'p': '16',
    'q': '17',
    'r': '18',
    's': '19',
    't': '20',
    'u': '21',
    'v': '22',
    'w': '23',
    'x': '24',
    'y': '25',
    'z': '26',
    '1': 'a',
    '2': 'b',
    '3': 'c',
    '4': 'd',
    '5': 'e',
    '6': 'f',
    '7': 'g',
    '8': 'h',
    '9': 'i',
    '10': 'j',
    '11': 'k',
    '12': 'l',
    '13': 'm',
    '14': 'n',
    '15': 'o',
    '16': 'p',
    '17': 'q',
    '18': 'r',
    '19': 's',
    '20': 't',
    '21': 'u',
    '22': 'v',
    '23': 'w',
    '24': 'x',
    '25': 'y',
    '26': 'z',
}


word =

 remove(input(''))

for x in word:

    print(dict[x])

Upvotes: 0

Austin Marshall
Austin Marshall

Reputation: 3107

''.join(map(lambda n: [chr(n),chr(n+96)][n<=26], map(int,map(''.join,zip(*[iter(s)]*2)))))

Upvotes: 0

PaulMcG
PaulMcG

Reputation: 63802

Make a single iterator to your input string, and call zip with it like:

it = iter(data)
pairs = zip(it, it)

Gives:

[('1', '9'), ('2', '0'), ('0', '1'), ('2', '5'), ('3', '2'), ('0', '8'), ('2', '1'), ('1', '4'), ('0', '7'), ('1', '8'), ('2', '5'), ('4', '6'), ('3', '2'), ('1', '9'), ('2', '0'), ('0', '1'), ('2', '5'), ('3', '2'), ('0', '6'), ('1', '5'), ('1', '5'), ('1', '2'), ('0', '9'), ('1', '9'), ('0', '8'), ('4', '6')]

Next pass this to map with a ''.join as the function to make integer strings:

>>> map(''.join, zip(it,it))
['19', '20', '01', '25', '32', '08', '21', '14', '07', '18', '25', '46', '32', '19', '20', '01', '25', '32', '06', '15', '15', '12', '09', '19', '08', '46']

Now pass this to map again, to convert to ints:

>>> map(int, map(''.join, zip(it,it)))
[19, 20, 1, 25, 32, 8, 21, 14, 7, 18, 25, 46, 32, 19, 20, 1, 25, 32, 6, 15, 15, 12, 9, 19, 8, 46]

Now pass this to map with a lambda to perform your decoding logic:

>>> map(lambda n : chr(n+96) if n < 27 else chr(n), map(int, map(''.join, zip(it,it))))
['s', 't', 'a', 'y', ' ', 'h', 'u', 'n', 'g', 'r', 'y', '.', ' ', 's', 't', 'a', 'y', ' ', 'f', 'o', 'o', 'l', 'i', 's', 'h', '.']

And lastly, pass this to ''.join:

>>> ''.join(map(lambda n : chr(n+96) if n < 27 else chr(n), map(int, map(''.join, zip(it,it)))))
'stay hungry. stay foolish.'

What could be simpler? :)

Upvotes: 4

Michael Hoffman
Michael Hoffman

Reputation: 34384

You can split up the str into two-character chunks using zip() and slicing with a step like this:

for pair in zip(input[::2], input[1::2]):
    number = "".join(pair)

I'd write the whole thing like this:

def int_str_to_chr_str(int_str):
    res = []
    for pair in zip(int_str[::2], int_str[1::2]):
        number = int("".join(pair))

        if number <= 26:
            number += 96

        res.append(chr(number))

    return "".join(res)

print int_str_to_chr_str("1920012532082114071825463219200125320615151209190846")

It's more useful to have the logic separated from input and output, so you can use the function in other parts of a program. It's also a good idea to avoid repeating the use of names like number or input (which is a built-in).

Upvotes: 1

Related Questions