簡體   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