【问题标题】:Python 2.7.4, does anyone know why this is not working?Python 2.7.4,有谁知道为什么这不起作用?
【发布时间】:2018-01-24 17:03:02
【问题描述】:

以下代码是我的一项练习通过主题,

这是我的代码:

rot13=raw_input("Please write your text! ")

这是我向用户询问文本的地方

for i in range(len(rot13)):

在这一部分中,我用 for 逐个字母地检查文本。

 if rot13[i]=="a":
     rot13[i]="n"
 elif rot13[i]=="b":
     rot13[i]="o"
 elif rot13[i]=="c":
     rot13[i]="p"
 elif rot13[i]=="d":
     rot13[i]="q"
 elif rot13[i]=="e":
     rot13[i]="r"
 elif rot13[i]=="f":
     rot13[i]="s"
 elif rot13[i]=="g":
     rot13[i]="t"
 elif rot13[i]=="h":
     rot13[i]="u"
 elif rot13[i]=="i":
     rot13[i]="v"
 elif rot13[i]=="j":
     rot13[i]="w"
 elif rot13[i]=="k":
     rot13[i]="x"
 elif rot13[i]=="l":
     rot13[i]="y"
 elif rot13[i]=="m":
     rot13[i]="z"
 elif rot13[i]=="n":
     rot13[i]="a"
 elif rot13[i]=="o":
     rot13[i]="b"
 elif rot13[i]=="p":
     rot13[i]="c"
 elif rot13[i]=="q":
     rot13[i]="d"
 elif rot13[i]=="r":
     rot13[i]="e"
 elif rot13[i]=="s":
     rot13[i]="f"
 elif rot13[i]=="t":
     rot13[i]="g"
 elif rot13[i]=="u":
     rot13[i]="h"
 elif rot13[i]=="v":
     rot13[i]="i"
 elif rot13[i]=="w":
     rot13[i]="j"
 elif rot13[i]=="x":
     rot13[i]="k"
 elif rot13[i]=="y":
     rot13[i]="l"
 elif rot13[i]=="z":
     rot13[i]="m" 

print rot13

有谁知道为什么这不起作用?我不想用编码来做。

【问题讨论】:

  • 欢迎来到 *!你想达到什么目标?预期和观察到的输出分别是什么?请通读*.com/help/how-to-ask 并相应地编辑您的问题。
  • 马上,我看到您正试图通过执行rot13[i] = "..." 将一个字符换成另一个字符。你不能在 Python 中做到这一点。考虑首先使用list(rot13) 将字符串转换为数组。但首先,您要实现什么目标?
  • 我试图向用户询问文本,我会用 rot13 字符打印它。实际上,当我使用 list(rot13) 使 rot13 成为列表时,我确实做到了,在此之后我做到了: keimeno="", for i in range (len(rot13)):, keimeno=keimeno +rot13[i], print keimeno 。所以它会像文本而不是列表一样打印它。
  • 为什么不迭代字母并构建一个新的字符串变量?另外,尝试使用从键(字母)到它的值(它的 log1,因为你知道字典大小)的映射。您可以将字符串迭代为字符列表,for char in rot13:
  • 我不会为您编写此代码,这是您的任务,请尝试编写尽可能简单的代码以达到最佳性能。从键到值的映射和构建网络字符串可以在 log(n) 中实现,在一行中,两行使这更易读,三行不使用字典构造函数。

标签: python-2.7 if-statement rot13


【解决方案1】:

您的代码存在一些问题。

首先,您尝试将字符分配给字符串,但字符串是不可变的,因此您无法使用= 交换字符。其次,您不需要对每个字符及其映射进行硬编码。您应该使用modulus 运算符 (%)。

基本的解决方案是循环遍历每个字符,将其变成一个数字,再给它加上 13,然后再将它变成一个字符。您必须考虑输入为“z”且结果字符超出字母表的情况。这就是你必须使用模运算符来强制字符环绕的地方。

这是一个例子:

def rot13(string):
  result = []
  for char in string:
    shiftBy = 65 # uppercase 'A'
    if char.islower():
      shiftBy = 97 # lowercase 'a'

    newChar = chr(((ord(char) + 13 - shiftBy) % 26) + shiftBy)
    result.append(newChar)

  return ''.join(result)

print rot13("abcXYZ")

ord 将字符转换为其数字表示(例如,'a' 变为 97

chr 进行反向计算(例如,97 变为 'a'

【讨论】:

  • 或使用string.maketrans 制作映射表,并使用strtranslate 方法以最有效的方式完成任何给定的单线转换(在Py3 上,它会是str.maketrans来做表)。
最近更新 更多