Преобразование букв алфавита в число в Python

Как можно завершить следующее?

characters = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''t''u''v''w''x''y''z']
numbers = ['1''2''3''4''5''6''7''8''9''10''11''12''13''14''15''16''17''18''19''20''21''22''23''24']
text = raw_input(' Write text: ')

Я пытался решить его многими способами, но не смог добраться до пинты. Я хочу сделать исключение. Если я набираю "привет", вывод должен быть в номерах, выровненных, как в алфавите. Пример a = 1 < в алфавите.

Ответ 1

Что-то вроде этого:

print [ord(char) - 96 for char in raw_input('Write Text: ').lower()]

ord
понимание списка
Коды символов ASCII

ИЗМЕНИТЬ
Поскольку вы попросили меня объяснить, что я... хотя это было хорошо объяснено в комментариях уже [?].

Сделайте это более чем в одной строке, чтобы начать.

input = raw_input('Write Text: ')
input = input.lower()
output = []
for character in input:
    number = ord(character) - 96
    output.append(number)
print output

Это делает то же самое, но более читаемо. Убедитесь, что вы можете понять, что происходит здесь, прежде чем попытаться понять мой первый ответ. Все здесь довольно стандартное, простое Python. Следует отметить функцию ord. ord для ординалов, и почти каждый язык высокого уровня будет иметь доступ к этой функции. Он дает сопоставление с численным представлением любого символа. Обратная функция ord называется chr.

chr(ord('x')) == 'x' # for any character, not just x.

Если вы проверите для себя, порядковый номер a равен 97 (третье звено, указанное выше, отобразит полный набор символов ASCII.) Каждая строчная буква находится в диапазоне 97-122 (26 символов). Итак, если вы просто вычитаете 96 из ординала любой строчной буквы, вы получите ее позицию в алфавите, если вы возьмете 'a' == 1. Итак, порядковый номер 'b' == 98, 'c' == 99 и т.д. Когда вы вычитаете 96, 'b' == 2, 'c' == 3 и т.д.

Остальное начальное решение, которое я разместил, - это просто какая-то хитрость Python, которую вы можете изучить под понятием list list. Но я бы не стал сосредоточиться на этом, так как я сосредоточусь на том, чтобы научиться решать проблему на любом языке, где ord - ваш друг. Надеюсь, это поможет.

Ответ 2

Не слишком простой, но это:

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

сильно отличается от этого:

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

Первый, без запятых и то, что у вас есть в вашем вопросе, представляет собой список из одного элемента с 26-строчной строкой. Второй - это список из 26 элементов, каждый из которых содержит один символ.

Если вы печатаете каждый:

>>> print char1, len(char1), len(char1[0])
['abcdefghijklmnopqrstuvwxyz'] 1 26
>>> print char2, len(char2), len(char2[0])
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 
'm', 'n', 'o', 'p', 'q','r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 26 1

Становится очевидным, что требуется дополнительный шаг, чтобы превратить отдельные символы char1 в iterable.

Если у вас есть sequence символов 'a' через 'z' и/или 'A' через 'Z', вы может легко вернуть число символов с помощью понимания списка:

>>> [ord(x)%32 for x in char2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

Для типа структуры данных вы должны сначала получить доступ к строке:

>>> [ord(x)%32 for x in char1[0]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

Итак, если ваш список кодов совпадает с вашим вопросом, это может быть вашей проблемой.

Возможная альтернатива: [ord(x.lower())-96 for x in char1[0]]

Вы можете видеть, что ваш characters=['a''b''c'...], без запятых, точно так же, как набирать все символы в строке в списке, подобном этому ['abc...'].

Итак, теперь попробуйте:

 >>> import string
 >>> [ord(x.lower())-96 for x in string.letters]
 [1,2,...26, 1,2,3...26]      # my ellipses 
 >>> char3=[string.letters]   # one string as element[0]
 >>> [ord(x)%32 for x in char3[0]]
 >>> [ord(x)%32 for x in [string.letters][0]]

Ответ 3

Это функция, которую я использовал для этой цели. Работает как в верхнем, так и в нижнем регистре.

def convert_char(old):
    if len(old) != 1:
        return 0
    new = ord(old)
    if 65 <= new <= 90:
        # Upper case letter
        return new - 64
    elif 97 <= new <= 122:
        # Lower case letter
        return new - 96
    # Unrecognized character
    return 0

Ответ 4

Если вы собираетесь использовать это преобразование много, подумайте о вычислении один раз и поместите результаты в словарь:

>>> import string
>>> di=dict(zip(string.letters,[ord(c)%32 for c in string.letters]))
>>> di['c'] 
3

Преимущество словарейских поисковых запросов очень быстрое, итерация по списку на каждый вызов.

>>> for c in sorted(di.keys()):
>>>    print "{0}:{1}  ".format(c, di[c])
# what you would expect....

Ответ 5

Что-то вроде this

[str(ord(c)&31) for c in text]

Ответ 6

>>> [str(ord(string.lower(c)) - ord('a') + 1) for c in string.letters]
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17',
'18', '19', '20', '21', '22', '23', '24', '25', '26', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24',
 '25', '26']

Ответ 7

Если целью является преобразование только букв abcd.... xyz и ABCD.... XYZ, я бы использовал функцию:

from string import letters
def rank(x, d = dict((letr,n%26+1) for n,letr in enumerate(letters[0:52]))):
    return d[x]

Ive написано [0:52], потому что моя версия Python 2.7 отображает значение

* ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz * ƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ

для аргумента string.letters.

Поскольку параметр d получает значение в качестве аргумента по умолчанию, исчисление этого значения выполняется только один раз, в момент, когда определение функции выполняется для создания объекта функции. Таким образом, функция может быть использована без этого значения, которое будет вычисляться снова, даже если функция обжалуется три тысячи раз.

Кстати, lower() не используется снова для каждой апелляции функции. Случай с верхними буквами обрабатывался во время построения аргумента по умолчанию.

.

Один пример использования:

word = 'supercalifragilisticexpialidocious'
print ''.join( letter if rank(letter)%3!=0 else '.' for letter in word)

результат:

s.pe..a.... аг... st..e.p.a..d..... s

.

Его также можно использовать с map():

print map(rank,'ImmunoElectroPhoresis')

результат:

[9, 13, 13, 21, 14, 15, 5, 12, 5, 3, 20, 18, 15, 16, 8, 15, 18, 5, 19, 9, 19]

Ответ 8

Если вы просто хотите сопоставить число с буквой, просто сделайте что-то простое:

def letter_to_index(letter):
    _alphabet = 'abcdefghijklmnopqrstuvwxyz'
    return next((i for i, _letter in enumerate(_alphabet) if _letter == letter), None)

Конечно, если вы хотите, чтобы он начинался с 1, просто добавьте (i + 1 для i,... и т.д.

Ответ 9

def letter_to_int(letter):
    alphabet = list('abcdefghijklmnopqrstuvwxyz')
    return alphabet.index(letter) + 1

здесь функция index (x) возвращает значение позиции x, если список содержит x.

Ответ 10

Здесь я использую, чтобы преобразовать буквы столбца excel в числа (так что ограничение на 3 буквы, но довольно легко расширить это, если вам нужно больше). Возможно, это не лучший способ, но он работает для того, что мне нужно.

def letter_to_number(letters):
    letters = letters.lower()
    dictionary = {'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}
    strlen = len(letters)
    if strlen == 1:
        number = dictionary[letters]
    elif strlen == 2:
        first_letter = letters[0]
        first_number = dictionary[first_letter]
        second_letter = letters[1]
        second_number = dictionary[second_letter]
        number = (first_number * 26) + second_number
    elif strlen == 3:
        first_letter = letters[0]
        first_number = dictionary[first_letter]
        second_letter = letters[1]
        second_number = dictionary[second_letter]
        third_letter = letters[2]
        third_number = dictionary[third_letter]
        number = (first_number * 26 * 26) + (second_number * 26) + third_number
    return number

Ответ 11

Вы можете использовать chr() и ord() для преобразования между буквами и номерами int.

Вот простой пример.

>>> chr(97)
'a'
>>> ord('a')
97

Ответ 12

Вот мое решение для проблемы, в которой вы хотите преобразовать все буквы в строке с положением этих букв на английском алфавите и вернуть строку из них.

https://gist.github.com/bondnotanymore/e0f1dcaacfb782348e74fac8b224769e

Сообщите мне, если вы хотите понять его подробно. Я использовал следующие понятия  - Учет списка  - Словарь понимания