如何在Python3上更改我要循环的字符串的值

2024-09-27 07:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现凯撒的密码,它用给定的密钥偏移任何字母(例如,如果密钥是2,那么“a”变成“c”)

这是我的密码:

key = 2
code = "abc def hi"
code_splitted = code.split()
for word in code_splitted:
    for char in word:
        char = chr(ord(char) + key)
print (" ".join(code_splitted))

但是,输入的是相同的代码“abc def hi”。有什么问题吗


Tags: keyin密码fordef字母密钥code
3条回答

您不能修改项目,您正在修改副本/尝试更改不可变对象

也就是说,最好的方法是使用2个嵌套的生成器理解结构:

key = 2
code = "abc def hi"
code_splitted = code.split()

code_splitted = ("".join(chr(ord(char) + key) for char in word) for word in code_splitted)
print (" ".join(code_splitted))

结果:

cde fgh jk

请注意,没有创建临时列表,因此它的性能更好,而且更具pythonic(不涉及索引)

python中的foreach循环提供了在提供的iterable中找到的项的副本。这意味着,当您更改“char”时,实际上并没有更改字符串中的数据。以下可能是您想要的:

for i in range(len(code_splitted)):
    for j in range(len(code_splitted[i])):
        code_splitted[i][j] = code_splitted[i][:j] + chr(ord(code_splitted[i][j]) + key) + code_splitted[i][j+1:]

这样做时,所有更改都直接对原始数组进行,而不是在python中创建副本

编辑:忘记字符串是不变的,固定的代码

如果您运行这个并选中char,您将看到您正在更新那个对象,但不是您最初引用的对象。您可以创建一个临时空白字符串并将新的键串起来,然后将其添加到列表中

下面的代码大部分用于维护您的代码:

key = 2
code = "abc def hi"
newcode=[]
code_splitted = code.split()
for word in code_splitted:
    tempcode = ''
    for char in word:
        tempcode += chr(ord(char) + key)
    newcode.append(tempcode)
print (" ".join(newcode))

相关问题 更多 >

    热门问题