Преобразование букв алфавита в число в 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 <в алфавите.

10 Solutions collect form web for “Преобразование букв алфавита в число в Python”

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

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

ога
список
Коды символов 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, которую вы можете узнать, узнав о понимании списка. Но я бы не стал сосредоточиться на этом, так как я сосредоточусь на том, чтобы научиться решать проблему на любом языке, где ord – ваш друг. Надеюсь, это поможет.

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

 >>> 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.... 

Не быть слишком основательным, но это:

 >>> 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 в итерируемый .

Если у вас есть последовательность символов «от» до «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]] 

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

 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 

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

 [str(ord(c)&31) for c in text] 
 >>> [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'] 

Если целью является преобразование только букв 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] 

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

* * * * *

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

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

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

,

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

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

результат:

s.pe..a …. аг … st..epa.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]

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

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

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

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

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

Вот что я использую, чтобы преобразовать буквы столбца 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 
  • IOError: Разрешение отклонено
  • Обрезано среднее с процентом в Python?
  • Список карт Python в список целых чисел
  • Сериализовать ключ сущности для строки в Python для GAE
  • Вклад в Python
  • Проблемы с изменением значения глобальной переменной в python
  • перечисление всех функций в модуле python
  • Организация исходных файлов cython и их тестов (с помощью nosetests)
  • Python - лучший язык программирования в мире.