2016-12-21 17 views
0

今後のコーディング競争のためにNiOからいくつかの練習をしていました。競争はオンラインで行われ、stdin.readlineを使用して自分のコードをテストすることができます。 stdinの使い方は私を本当にくっついてしまった。スクリプトはraw_inputで完璧に動作していますが、sys.stdin.readlineに切り替えるたびに "ValueError:substring not found"がスローされます。私は何かばかげた間違ったことをしていますか?Pythonプログラムはraw_input()では動作しますが、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 
+0

は、どのようにそれを呼び出していると何を入力のための後、コマンドラインで入力していますか?エラーはどこにありますか?あなたの質問にテキストのスクリーンダンプを投稿してください。 –

+0

'readline()'は文字列の最後に改行を含みます。 'ab'に改行がないので、最後の文字に到達すると' ab.index(文字) 'が失敗します。 – Barmar

+0

入力のいずれかが大文字でない場合、コードでエラーが発生します。 – Barmar

答えて

2

readline()は、末尾の改行文字を含む、行全体を返します。 \nascii_uppercaseに存在しないため、エラーが発生しています。

txt = sys.stdin.readline().strip()を使用してください。エラーはなくなります。

+0

より一般的には: 't.ex.(もし)x.isalpha()ならば、' txt = [sys.stdin.readline()のxのx.upper()が良い方法かもしれません。代わりに、 'isalpha'と' upper'コールをループ内に置くこともできます。 –

+0

私はそれを答えにするつもりだと思う。 –

+0

うん、しました。どうもありがとうございます! –

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()] 

これらの方法の組み合わせはいくつでも使用できます。ところで

、あなたの入力のためのプロンプトを持つことに興味があるならば、end=''printを使用します。

print('How far to shift? ', end='') 
n = int(sys.stdin.readline()) 
print('Text to encode? ', end='') 
txt = sys.stdin.readline() 
... 
関連する問題