Eddy
Eddy

Reputation: 6861

python: How do I assign values to letters?

I want to assign a value to each letter in the alphabet, so that a -> 1, b -> 2, c -> 3, ... z -> 26. Something like a function which returns the value of the letter, for example:

value('a') = 1

value('b') = 2

etc...

How would I go about doing this in python?

Upvotes: 6

Views: 67978

Answers (10)

hola
hola

Reputation: 612

You can use ord built-in function. This function well do what you are looking for

def letter_value(letter):
    return ord(letter) - ord("a") + 1

Upvotes: 0

taless
taless

Reputation: 166

It's not necessary to import a library. You can use this:

value = dict(zip("abcdefghijklmnopqrstuvwxyz", range(1,27)))

Upvotes: 1

Gavin Panella
Gavin Panella

Reputation: 133

from itertools import count
from string import lowercase
value = dict(zip(lowercase, count(1))).get

Upvotes: 2

Ben James
Ben James

Reputation: 125167

If you just want to map characters of the ASCII alphabet to numbers, you can use ord() and then adjust the result:

>>> ord('a') - 96
1

If you want this to work for uppercase letters too:

>>> ord('A'.lower()) - 96
1

Also, you might want to validate that the argument is indeed a single ASCII character:

>>> char = 'a'
>>> len(char) == 1 and char.isalpha() and 'a' <= char <= 'z'
True

Or:

>>> import string
>>> len(char) == 1 and char in string.ascii_lowercase
True

Upvotes: 7

jsbueno
jsbueno

Reputation: 110301

You want a native python dictionary.

(and you probably also want your values to start from"0" not from "1" , so you can void adding a +1 on all your mappings, as bellow)

Build one with this:

import string
values = dict()
for index, letter in enumerate(string.ascii_lowercase):
   values[letter] = index + 1

This give syou things like:

print values["a"]
-> 1

Of course, you probably could use the "ord" built-in function and skip this dictionary altogether, as in the other answers:

print ord("c") - (ord("a")) + 1

Or in python 3.x or 2.7, you can create the dicionary in a single pass with a dict generator expression:

values = {chr(i): i + 1 for i in range(ord("a"), ord("a") + 26)}

Upvotes: 11

Benjamin Wohlwend
Benjamin Wohlwend

Reputation: 31828

How about this?

import string
value = lambda x: string.ascii_lowercase.index(x) + 1

In [1]: value("a")
Out[1]: 1

Upvotes: 0

Jordan
Jordan

Reputation: 5058

Why not just make a list of each letter in the alphabet and then use the index values as the return value

Upvotes: 0

Donald Miner
Donald Miner

Reputation: 39893

You should exploit the fact that 'a', 'b', etc. have ASCII values behind them.

ord('a') # this returns int 97
ord('b') # this returns int 98

Therefore, you could do something like:

ord(letter) - ord('a') + 1 # e.g., a: 97 - 97 + 1 = 1

Upvotes: 0

Ned Batchelder
Ned Batchelder

Reputation: 375584

def value(letter):
    return ord(letter) - ord('a') + 1

Upvotes: 3

Mad Scientist
Mad Scientist

Reputation: 18553

Use a dictionary for key:value pairs. Although for a simple mapping like this there are probably some clever ways of doing this.

Upvotes: 2

Related Questions