[英]Python program works with raw_input() but not with sys.stdin.readline
我正在为即将举行的编码竞赛从NiO做一些练习任务。 比赛在线进行,迫使我使用stdin.readline,以便他们可以测试我的代码。 使用stdin确实使我陷入困境。 该脚本使用raw_input可以完美运行,但是每当我切换到sys.stdin.readline时,都会引发“ ValueError:未找到子字符串”。 我做错了什么吗?
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
readline()
将返回整行,包括结尾的换行符。 由于\\n
在ascii_uppercase
不存在, ascii_uppercase
会出现错误。
使用txt = sys.stdin.readline().strip()
,错误应消失。
代码的根本缺陷在于,您不清理输入内容,最后得到一个非法字符( \\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
with end=''
:
print('How far to shift? ', end='')
n = int(sys.stdin.readline())
print('Text to encode? ', end='')
txt = sys.stdin.readline()
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.