web-dev-qa-db-ja.com

入手方法 ASCII 文字の値

Python で文字の _ ascii _ 値をintとして取得する方法を教えてください。

909
Matt

ここから

関数ord()は、charのint値を取得します。あなたが数で遊んだ後にあなたが戻って変換したいならば、関数chr(​​)はトリックをします。

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

Python 2にはunichr関数もあり、序数がunichr引数である Unicode 文字を返します。

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

Python 3ではchrの代わりにunichrを使うことができます。


ord() - Python 3.6.5rc1ドキュメント

ord() - Python 2.7.14ドキュメント

1184
Matt J

ord()はASCIIの値そのものをあなたに与えないことに注意してください。そのため、Latin-1を使用している場合はord('ä')の結果は228になり、UTF-8を使用している場合はTypeErrorが発生する可能性があります。 Unicodeを渡すと、代わりにUnicodeコードポイントを返すこともできます。

>>> ord(u'あ')
12354
151

あなたは探している:

ord()
45
Jacob Krall

受け入れられた答えは正しいですが、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オブジェクトを持たないため(bytesstrのエイリアスで、文字ごとに反復する)、少しだけ複雑になりますが、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の両方のローカルテストでは、map(ord, mystr)を使用してASCIIコードを取得するためにstrを繰り返すと、Py2でbytearray(mystr)またはPy3でmystr.encode('ascii')を使用するよりもlen 10 strの約2倍の時間がかかります、およびstrが長くなると、map(ord, mystr)に支払われる乗数は〜6.5x-7xに上がります。

唯一の欠点は、変換が一度にすべて行われるため、最初の結果に少し時間がかかる可能性があり、本当に巨大なstrが比例的に大きな一時bytes/bytearrayを持つことになりますが、ページスラッシングを強制しない限り、これはそうではありません問題になる可能性があります。

28
ShadowRanger