首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python程序可以使用raw_input(),但不能使用sys.stdin.readline

Python程序可以使用raw_input(),但不能使用sys.stdin.readline
EN

Stack Overflow用户
提问于 2016-12-22 04:56:42
回答 2查看 355关注 0票数 0

我在NiO为即将到来的编码比赛做一些练习任务。比赛在网上举行,迫使我使用stdin.readline,这样他们就可以测试我的代码。stdin的用法真的让我卡住了。该脚本可以完美地与raw_input一起运行,但每当我切换到sys.stdin.readline时,它都会抛出"ValueError: substring not found“。我是不是做错了什么?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2016-12-22 05:00:28

readline()将返回整个行,包括末尾的换行符。由于ascii_uppercase中不存在\n,因此会出现错误。

使用txt = sys.stdin.readline().strip(),错误就会消失。

票数 2
EN

Stack Overflow用户

发布于 2016-12-22 05:09:54

您的代码的根本缺陷是您没有清理您的输入,并且在最后得到一个非法字符(\n)。操作ab.index(...)假设所有输入都是大写字母,所以当输入不是大写字母时,它就会失败。

你可以用几种方法来解决这个问题。一种是将所有可以转换为大写的内容转换为大写,其余的保持原样:

代码语言:javascript
复制
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]

或者,您也可以丢弃所有非大写输入:

代码语言:javascript
复制
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()]

您可以使用这些方法的任意数量的组合。

顺便说一句,如果您对输入提示感兴趣,可以结合使用printend=''

代码语言:javascript
复制
print('How far to shift? ', end='')
n = int(sys.stdin.readline())
print('Text to encode? ', end='')
txt = sys.stdin.readline()
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41271763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档