我正在为NiO做一些即将进行的编码比赛的练习任务。比赛在线举行,迫使我使用stdin.readline,以便他们可以测试我的代码。 stdin的使用让我真的陷入困境。该脚本使用raw_input完美运行但抛出" ValueError:substring not found"每当我切换到sys.stdin.readline。我做了一些愚蠢的错误吗?
import string
import sys
n = int(sys.stdin.readline())
txt = sys.stdin.readline()
ab = string.ascii_uppercase
result = ""
for letter in txt:
result += ab[((ab.index(letter) + n) % 26)]
print result
答案 0 :(得分:2)
readline()
将返回整行,包括最后的换行符。由于\n
中不存在ascii_uppercase
,因此您收到错误。
使用txt = sys.stdin.readline().strip()
,错误应该消失。
答案 1 :(得分:1)
您的代码的根本缺陷是您不会清理您的输入,并且您最终会获得非法字符(\n
)。操作ab.index(...)
假定所有输入都是大写字母,因此当它们不是时会失败。
您可以通过多种方式解决此问题。一种方法是将可以转换为大写的所有内容转换为大写,并将其余内容保留为原样:
import string, sys
ab = string.ascii_uppercase
n = int(sys.stdin.readline())
txt = sys.stdin.readline()
result = [ab[(ab.index(letter.upper()) % n) % 26] for letter in txt if letter.isalpha() else letter]
或者,您可以丢弃所有非大写输入:
import string, sys
ab = string.ascii_uppercase
n = int(sys.stdin.readline())
txt = sys.stdin.readline()
result = [ab[(ab.index(letter) % n) % 26] for letter in txt if letter.isupper()]
您可以使用这些方法的任意数量的组合。
顺便说一下,如果您有兴趣提示输入,请print
使用end=''
:
print('How far to shift? ', end='')
n = int(sys.stdin.readline())
print('Text to encode? ', end='')
txt = sys.stdin.readline()
...