繁体   English   中英

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

[英]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()将返回整行,包括结尾的换行符。 由于\\nascii_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM