在Python中将字母转换为数字

81 投票
19 回答
452235 浏览
提问于 2025-04-16 09:00

下面的内容应该怎么完成呢?

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: ')

我尝试了很多方法,但始终没有找到解决办法。我想做一个程序。如果我输入“hello”,那么输出应该是像字母表那样的数字排列。例如,字母a对应数字1。

19 个回答

13

虽然这听起来很基础,但其实:

>>> 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中的每个字符变成一个可迭代对象需要多一步操作。

如果你有从'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]]
49

你可以使用chr()和ord()这两个函数来在字母和整数之间进行转换。

下面是一个简单的例子。

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

那我们来看看这样的内容:

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的小技巧,叫做列表推导式。但我建议你不要太关注这个,而是要专注于学习如何用任何语言解决问题,ord函数会是你的好帮手。

撰写回答