我在NiO为即将到来的编码比赛做一些练习任务。比赛在网上举行,迫使我使用stdin.readline,这样他们就可以测试我的代码。stdin的用法真的让我卡住了。该脚本可以完美地与raw_input一起运行,但每当我切换到sys.stdin.readline时,它都会抛出"ValueError: substring not found“。我是不是做错了什么?
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发布于 2016-12-22 05:00:28
readline()将返回整个行,包括末尾的换行符。由于ascii_uppercase中不存在\n,因此会出现错误。
使用txt = sys.stdin.readline().strip(),错误就会消失。
发布于 2016-12-22 05:09:54
您的代码的根本缺陷是您没有清理您的输入,并且在最后得到一个非法字符(\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()
...https://stackoverflow.com/questions/41271763
复制相似问题