Python程序适用于raw_input(),但不适用于sys.stdin.readline

时间:2016-12-21 20:56:42

标签: python

我正在为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

2 个答案:

答案 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()
...