在Python中将字符串/字符转换为整数

19

我想把字符串中的一个字符转换成整数,加上2后再转回字符串。 因此,A变为C,K变为M等。

8个回答

26

通过chr和ord函数实现。例如;chr(ord(ch)+2)可以达到你想要的效果。这些函数在这里有详细描述。


16
这听起来很像作业,我会给你一些提示,让你自己完成剩下的部分。
要访问字符串 s 的单个字符,可以使用 s[x],其中 x 是整数索引。索引从0开始。
要获取字符c的整数值,可以使用ord(c),要将整数转换回字符,则使用chr(x)。 要注意字母接近字母表的末尾!
编辑:如果您不知道如何处理Y和Z,请留言,我会给出提示。

2
提供良好的作业指导,但不要透露解决方案。 - Kena
是的,我一直担心有人会认为这是作业。我已经获得了计算机科学学士学位,并且是一个ASP.NET程序员。但我一直在学习Django,并想通过使用此网站:http://www.pythonchallenge.com/pc/def/map.html来提高我的Python技能。无论如何,我认为“ord”就是我要找的函数;下班后我会尝试一下。谢谢大家的建议! - Luke
1
啊,好吧。关于让问题不像作业的建议,如果您感兴趣的话:只发布您想要回答的问题部分(例如“如何在Python中将字符转换为整数”,而不是整个问题,我记得这实际上是我在学校密码学课程中的第一个问题之一),而且,我认为仅仅说“这可能听起来像作业,但它不是”会让我们所有人从我们的回答中去除轻蔑的语气 :) 虽然那看起来像一个很酷的网站,我得去看看。 - danben

4
通常情况下,只需将 ord 和 2 相加,然后再将其转换为字符 chr 即可。(对于 Y 和 Z,它们会给出意外的结果(“[”,“\”))。
>>> chr(ord("A")+2)
'C'

如果你想将Y、Z改为A、B,可以按照以下步骤操作。
>>> chr((ord("A")-0x41+2)%26+0x41)
'C'
>>> chr((ord("Y")-0x41+2)%26+0x41)
'A'
>>> chr((ord("Z")-0x41+2)%26+0x41)
'B'

这里是从A到Z

>>> [chr((i-0x41+2)%26+0x41) for i in range(0x41,0x41+26)]
['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'A', 'B']

3

http://docs.python.org/library/functions.html

ord(c)

如果给定的字符串长度为1,则返回一个整数,该整数表示当参数是unicode对象时字符的Unicode代码点,或者当参数是8位字符串时该字节的值。例如,ord('a')返回整数97,ord(u'\u2020')返回8224。这相当于8位字符串的chr()和unicode对象的unichr()的反函数。如果给定了一个unicode参数并且Python使用UCS2 Unicode构建,则该字符的代码点必须在[0..65535]范围内,否则字符串长度为2,将引发TypeError异常。


2
"ord"只是解决方案的一部分。你提到的谜题会进行旋转,因此“X”+3会旋转到“A”。其中最著名的是rot-13,它旋转了13个字符。将rot-13应用两次(旋转26个字符)即可将文本还原回原始状态。
最简单的处理方式是使用翻译表。
import string

def rotate(letters, n):
    return letters[n:] + letters[:n]

from_letters = string.ascii_lowercase + string.ascii_uppercase
to_letters = rotate(string.ascii_lowercase, 2) + rotate(string.ascii_uppercase, 2)

translation_table = string.maketrans(from_letters, to_letters)

message = "g fmnc wms bgblr"
print message.translate(translation_table)

这里没有任何一个ord()或chr()函数。这是因为我正在回答与所问问题不同的问题。 ;)

@dalke已经知道这个,但是对于那些不知道的人来说,更简单的方法是使用message.decode('rot13')来执行上述操作。 (上述是rot-n.) - Peter Hansen

1

试试 ord() 函数,应该可以解决问题 :)


0
对于那些需要对字符串中的每个字符执行操作的人来说,另一种处理方式是将 str 对象转换为/从 bytes 对象进行处理,这将利用 bytes 对象只是整数序列的事实。
import numpy


old_text_str = "abcde"  # Original text
old_num_list = list(old_text_str.encode())  # Integer values of the original text
new_num_list = numpy.add(old_num_list, 2).tolist()  # Add +2 to the integer values
new_text_str = bytes(new_num_list).decode()  # Updated text

print(f"{old_text_str=}")
print(f"{old_num_list=}")
print(f"{new_num_list=}")
print(f"{new_text_str=}")

输出:

old_text_str='abcde'
old_num_list=[97, 98, 99, 100, 101]
new_num_list=[99, 100, 101, 102, 103]
new_text_str='cdefg'

相关主题:


0

对于整个字符串,这将是:

>>> s = "Anne"
>>> ''.join([chr(ord(i)+2) for i in s]) 
'Cppg'

对于 'Y','Z' 等人来说,编程是很困难的。

>>> s = "Zappa"
>>> ''.join([chr(ord(i)+2) for i in s]) 
'\\crrc'

函数:chrord


''.join([chr(ord(i)+2) for i in s])会执行相同的操作。 - Nikwin
方括号到底有什么作用?为什么不能使用另一组圆括号? - Luke

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