Как получить значение ASCII символа?

Как я могу получить значение ASCII символа как int в питоне?

7 ответов

Решение

Отсюда:

Функция ord() получит значение типа char. И если вы хотите преобразовать обратно после игры с числом, функция chr() делает свое дело.

>>> ord('a')
97
>>> chr(97)
'a'
>>> chr(ord('a') + 3)
'd'
>>>

В Python 2 есть также unichr функция, возвращающая символ Unicode, порядковый номер которого unichr аргумент:

>>> unichr(97)
u'a'
>>> unichr(1234)
u'\u04d2'

В Python 3 вы можете использовать chr вместо unichr,


ord() - документация Python 3.6.5rc1

ord() - документация по Python 2.7.14

Обратите внимание, что ord() не дает вам значение ASCII само по себе; он дает вам числовое значение символа в любой кодировке, в которой он находится. Следовательно, результат ord('ä') может быть 228, если вы используете Latin-1, или это может поднять TypeError если вы используете UTF-8. Вместо этого он может даже вернуть код Unicode, если вы передадите ему Unicode:

>>> ord(u'あ')
12354

Ты ищешь:

ord()

Принятый ответ правильный, но есть более умный / эффективный способ сделать это, если вам нужно конвертировать целую кучу символов ASCII в их коды ASCII одновременно. Вместо того, чтобы делать:

for ch in mystr:
    code = ord(ch)

или немного быстрее:

for code in map(ord, mystr):

вы конвертируете в нативные типы Python, которые итерируют коды напрямую. На Python 3 это тривиально:

for code in mystr.encode('ascii'):

а в Python 2.6/2.7 он немного более сложный, потому что у него нет стиля Py3 bytes объект (bytes это псевдоним для str, который повторяется по символу), но у них есть bytearray:

# If mystr is definitely str, not unicode
for code in bytearray(mystr):

# If mystr could be either str or unicode
for code in bytearray(mystr, 'ascii'):

Кодирование как тип, который итеративно повторяется по порядковому номеру, означает, что преобразование происходит намного быстрее; в локальных тестах на Py2.7 и Py3.5, итерация str чтобы получить его ASCII-коды, используя map(ord, mystr) начинается примерно вдвое дольше для len 10 str чем с помощью bytearray(mystr) на Py2 или mystr.encode('ascii') на Py3, и как str становится длиннее, множитель оплачен map(ord, mystr) поднимается до ~6,5x-7x.

Единственным недостатком является то, что преобразование происходит одновременно, поэтому ваш первый результат может занять немного больше времени и по-настоящему огромный str будет иметь пропорционально большой временный bytes/bytearray, но если это не заставит вас ломать страницу, это вряд ли будет иметь значение.

Чтобы получить код ASCII символа, вы можете использовать ord() функция.

Вот пример кода:

value = input("Your value here: ")
list=[ord(ch) for ch in value]
print(list)

Выход:

Your value here: qwerty
[113, 119, 101, 114, 116, 121]

Numpy также можно использовать для получения значения ascii символа. Это особенно полезно, если вам нужно преобразовать множество символов в их кодовые точки ascii/unicode. В зависимости от количества символов это может быть на порядки быстрее, чем вызовordв петле.

Чтобы использовать его, оберните строку/символ в массив numpy и просмотрите его какint, который возвращает соответствующие числовые значения символов в любой кодировке, в которой они находятся.

      import numpy as np

# if the characters are in a list
lst = ['a', 'ä', 'あ']
ary = np.array(lst).view(int).tolist()   # [97, 228, 12354]


# if the characters are in a string
s = 'abc'
ar = np.array([s])
v = s_arr.view(int)                      # array([97, 98, 99])

В качестве примечания: одна особенность представления заключается в том, что если вы измените представление, исходное представление также изменится. Например, если мы хотим сделать все символы вarверхний регистр, мы могли бы сделать это, работая надv:

      v -= 32
print(ar)   # ['ABC']

ord(x) возвращает Юникод x.

Поскольку Unicode является расширением ASCII, ordтакже будет работать для всего, что закодировано ASCII. Обратите внимание, что возвращаемое значение является десятичным. Если вы хотите его на другой базе, вы можете использовать

bin(ord(x))oct(ord(x))hex(ord(x))

как вы считаете нужным.

Другие вопросы по тегам