将字符串转换为ASCII值的Python代码。

99
如何将字符串转换为ASCII值?
例如,"hi"将返回[104 105]。
我可以分别使用ord('h')和ord('i'),但是当有很多字母时,这将变得麻烦。
10个回答

150

你可以使用列表推导式:

>>> s = 'hi'
>>> [ord(c) for c in s]
[104, 105]

33

这里有一种相当简洁的方法来执行字符串拼接:

>>> s = "hello world"
>>> ''.join(str(ord(c)) for c in s)
'10410110810811132119111114108100'

还有一种有趣的替代方法:

>>> '%d'*len(s) % tuple(map(ord, s))
'10410110810811132119111114108100'

4
我当时在想什么?这个比我的更符合Python的风格。这就是我在读了一堆Haskell问题后试图回答一个Python问题所得到的结果...+1 - Nate
好的例子。谢谢分享。 - Amir Md Amiruzzaman

14

在2021年,我们可以假设只有Python 3是相关的,所以...

如果您的输入是bytes

>>> list(b"Hello")
[72, 101, 108, 108, 111]

如果你的输入是str

>>> list("Hello".encode('ascii'))
[72, 101, 108, 108, 111]

如果您希望一个适用于两种情况的解决方案:

list(bytes(text, 'ascii'))

(如果str包含非ASCII字符,以上所有内容都会有意地引发UnicodeEncodeError。这是一个合理的假设,因为询问非ASCII字符的“ASCII值”是没有意义的。)


8
如果您正在使用Python 3或更高版本,
>>> list(bytes(b'test'))
[116, 101, 115, 116]

1
一个很好的方法,但是对于字节输入来说bytes()是多余的,而对于字符串输入,你需要指定一个编码。 - MestreLion

7
如果你希望将结果拼接起来,就像你在问题中展示的一样,可以尝试以下方法:
>>> reduce(lambda x, y: str(x)+str(y), map(ord,"hello world"))
'10410110810811132119111114108100'

3

您的描述有些混淆不清,在大多数情况下,直接连接十进制值似乎并没有什么用处。以下代码将把每个字母转换为8位字符,然后再进行连接。这就是标准ASCII编码的工作方式。

def ASCII(s):
    x = 0
    for i in xrange(len(s)):
        x += ord(s[i])*2**(8 * (len(s) - i - 1))
    return x

3

很难理解为什么要连接(十进制)“ascii值”。但可以肯定的是,如果没有前导零(或其他填充或分隔符),连接它们是没有用的--从这样的输出中无法可靠地恢复任何信息。

>>> tests = ["hi", "Hi", "HI", '\x0A\x29\x00\x05']
>>> ["".join("%d" % ord(c) for c in s) for s in tests]
['104105', '72105', '7273', '104105']

请注意,前三个输出具有不同的长度。请注意,第四个结果与第一个相同。
>>> ["".join("%03d" % ord(c) for c in s) for s in tests]
['104105', '072105', '072073', '010041000005']
>>> [" ".join("%d" % ord(c) for c in s) for s in tests]
['104 105', '72 105', '72 73', '10 41 0 5']
>>> ["".join("%02x" % ord(c) for c in s) for s in tests]
['6869', '4869', '4849', '0a290005']
>>>

请注意,没有这样的问题。

2
def stringToNumbers(ord(message)):
    return stringToNumbers
    stringToNumbers.append = (ord[0])
    stringToNumbers = ("morocco")

1
你可以使用NumPy来实现这个操作:
import numpy as np
a = np.fromstring('hi', dtype=np.uint8)
print(a)

2
请注意,fromstring现已弃用,因此最好使用类似于np.frombuffer(b'hi', dtype=np.uint8)的方法。 - Alex Moore-Niemi

0
如果您不介意依赖numpy,您也可以通过将字符串转换为一维numpy ndarray,并将其视为int32 dtype来完成。
import numpy as np

text = "hi"
np.array([text]).view('int32').tolist()   # [104, 105]

请注意,与内置的ord()函数类似,上述操作返回字符的Unicode代码点(如果字符串很长,则速度更快),而.encode()将字符串文字编码为字节文字,只允许ASCII字符。对于当前问题的范围来说,这不是一个问题,但如果你有一个非ASCII字符,比如日语、俄语等,你可能得不到你期望的结果。
例如:
s = "Меси"
list(map(ord, s))                     # [1052, 1077, 1089, 1080]
np.array([s]).view('int32').tolist()  # [1052, 1077, 1089, 1080]
list(s.encode())                      # [208, 156, 208, 181, 209, 129, 208, 184]

为了使我的系统正常工作,需要分别使用np.array([text]).view(dtype=np.int32).tolist()np.array([s]).view(dtype=int32).tolist() - undefined
@Andj 感谢你指出那个问题。我已经相应地编辑了帖子。谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接