在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: ')
我尝试了很多方法,但始终没有找到解决办法。我想做一个程序。如果我输入“hello”,那么输出应该是像字母表那样的数字排列。例如,字母a对应数字1。
19 个回答
虽然这听起来很基础,但其实:
>>> 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]]
你可以使用chr()和ord()这两个函数来在字母和整数之间进行转换。
下面是一个简单的例子。
>>> chr(97)
'a'
>>> ord('a')
97
那我们来看看这样的内容:
print [ord(char) - 96 for char in raw_input('Write Text: ').lower()]
编辑
既然你让我解释一下,我就来解释一下... 不过在评论里已经有人讲得很清楚了。
我们先用多行代码来做这个。
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函数会是你的好帮手。