在Python中将字母转换为数字

alt*_*tin 50 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: ')
Run Code Online (Sandbox Code Playgroud)

我试图以很多方式解决它,但无法达到品脱.我想做一些.如果我输入"hello",输出的数字就像字母一样.示例a = 1 <字母表中.

sbe*_*rry 77

这样的事情怎么样:

print [ord(char) - 96 for char in raw_input('Write Text: ').lower()]
Run Code Online (Sandbox Code Playgroud)

ord
list comprehension
ASCII字符代码

编辑
因为你要我解释我会...虽然已经在[?]的评论中得到了很好的解释.

让我们在更多的一行开始这样做.

input = raw_input('Write Text: ')
input = input.lower()
output = []
for character in input:
    number = ord(character) - 96
    output.append(number)
print output
Run Code Online (Sandbox Code Playgroud)

这做同样的事情,但更具可读性.在您尝试理解我的第一个答案之前,请确保您能够理解这里发生了什么.这里的一切都非常标准,简单的Python.需要注意的一点是ord功能.ord代表序数,几乎每种高级语言都有这种功能.它为您提供了任何角色的数字表示的映射.ord的反函数称为chr.

chr(ord('x')) == 'x' # for any character, not just x.
Run Code Online (Sandbox Code Playgroud)

如果你自己测试,a的序数是97(我上面发布的第三个链接将显示完整的ASCII字符集.)每个小写字母在97-122(26个字符)范围内.所以,如果你只是减去96来自任何小写字母的序数,你将得到它在字母表中的位置,假设你取'a'== 1.所以,序数为'b'== 98,'c'== 99,等等.当你减去96,'b'== 2,'c'== 3等.

我发布的初始解决方案的其余部分只是一些Python技巧,你可以学习称为列表理解.但是,我不会专注于那个,因为我会专注于学习用任何语言来解决问题,其中ord是你的朋友.我希望这有帮助.

  • 哇,这很完美,谢谢...如果我打扰你,我很抱歉,但如果你能向我解释代码,我会很感激:) (2认同)

Sta*_*ham 16

您可以使用chr()和ord()来转换字母和整数.

这是一个简单的例子.

>>> chr(97)
'a'
>>> ord('a')
97
Run Code Online (Sandbox Code Playgroud)

  • 仅代码的答案很少有用.请解释这是如何回答这个问题的.谢谢. (6认同)
  • 我不同意,我通常向下滚动,直到找到一个整洁而简短的代码答案来复制和粘贴,同时避免阅读冗长的解释 (3认同)

daw*_*awg 9

不要太基础,但这个:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

与此截然不同:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

第一个,没有逗号和你的问题中的内容,是一个带有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
Run Code Online (Sandbox Code Playgroud)

显而易见的是,将单个字符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]
Run Code Online (Sandbox Code Playgroud)

对于您拥有的数据结构类型,您需要首先访问该字符串:

>>> [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]
Run Code Online (Sandbox Code Playgroud)

因此,如果您的代码清单与您的问题相同,则可能是您的问题.

一个合理的选择是: [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]]
Run Code Online (Sandbox Code Playgroud)


the*_*olf 9

如果您打算多次使用此转换,请考虑计算一次并将结果放入字典中:

>>> import string
>>> di=dict(zip(string.letters,[ord(c)%32 for c in string.letters]))
>>> di['c'] 
3
Run Code Online (Sandbox Code Playgroud)

优点是字典查找非常快,而不是在每次调用时遍历列表.

>>> for c in sorted(di.keys()):
>>>    print "{0}:{1}  ".format(c, di[c])
# what you would expect....
Run Code Online (Sandbox Code Playgroud)


par*_*446 6

这是我过去常用的功能.适用于大写和小写.

def convert_char(old):
    if len(old) != 1:
        return 0
    new = ord(old)
    if 65 <= new <= 90:
        # Upper case letter
        return new - 64
    elif 97 <= new <= 122:
        # Lower case letter
        return new - 96
    # Unrecognized character
    return 0
Run Code Online (Sandbox Code Playgroud)


Ase*_*hia 6

您可以将字母表映射到列表并按照以下方式返回每个字母表的索引:

import string

alphabet=string.ascii_lowercase
#alphabet='abcdefghijklmnopqrstuvwxyz'

#Get the character index , ex: e  
print(chars.find('e'))
#This will return 4
Run Code Online (Sandbox Code Playgroud)

  • 您当然指的是“alphabet.find”,而不是“chars.find”。也不应该是“chars.find('e') + 1”吗?只是提一下。 (2认同)
  • 虽然此代码可以解决问题,但包括解释如何以及为何解决问题将真正有助于提高帖子的质量,并可能会带来更多的赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。您可能想看一下[答案]。 (2认同)

Kab*_*bie 5

这样

[str(ord(c)&31) for c in text]
Run Code Online (Sandbox Code Playgroud)