2016-12-21 7 views
0

Ich machte einige Übungsaufgaben von NiO für eine bevorstehende Codierung Wettbewerb. Der Wettbewerb wird online abgehalten und zwingt mich, stdin.readline zu verwenden, damit sie meinen Code testen können. Die Verwendung von Stdin hat mich wirklich feststecken. Das Skript läuft einwandfrei mit raw_input, aber "ValueError: substring not found" wird ausgelöst, wenn ich zu sys.stdin.readline wechsle. Mache ich etwas Dummes falsch?Python-Programm arbeitet mit raw_input(), aber nicht mit 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

Wie werden Sie es fordern und was tippen Sie auf der Kommandozeile nach dem für die Eingabe? Wo ist der Fehler genau? Bitte posten Sie einen Text-Bildschirm-Dump in Ihrer Frage. –

+0

'readline()' enthält den Zeilenumbruch am Ende der Zeichenfolge. Es gibt keine neue Zeile in 'ab', so dass' ab.index (letter) 'fehlschlägt, wenn Sie zum letzten Zeichen kommen. – Barmar

+0

Ihr Code wird diesen Fehler erhalten, wenn die Eingabe kein Großbuchstabe ist. – Barmar

Antwort

2

readline() wird die gesamte Zeile zurück, am Ende des Zeilenende-Zeichen enthält. Da \n in ascii_uppercase nicht vorhanden ist, erhalten Sie den Fehler.

Verwenden Sie txt = sys.stdin.readline().strip() und der Fehler sollte weggehen.

+0

Allgemeiner gesagt: 'txt = [x.upper() für x in sys.stdin.readline() falls x.isalpha()] 'könnte ein besserer Ansatz sein. Alternativ können Sie die Aufrufe 'isalpha' und 'upper' in die Schleife einfügen. –

+0

Ich denke, ich werde das eine Antwort geben. –

+0

Ja, hat es getan. Ich danke dir sehr! –

1

Der grundlegende Fehler mit Ihrem Code ist, dass Sie Ihre Eingabe nicht bereinigen und Sie erhalten am Ende ein ungültiges Zeichen (\n). Die Operation ab.index(...) geht davon aus, dass alle Eingaben Großbuchstaben sind, so dass sie fehlschlagen, wenn sie nicht vorhanden sind.

Sie können dies auf verschiedene Arten beheben. Eine davon ist alles zu konvertieren, die umgewandelt werden können in Großbuchstaben in Großbuchstaben und den Rest lassen, wie sie ist:

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] 

Alternativ können Sie auch einfach wegwerfen, die alle nicht-Groß Eingänge:

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

Es gibt eine beliebige Anzahl von Kombinationen dieser Methoden, die Sie verwenden könnten.

By the way, wenn Sie in mit einer Eingabeaufforderung für Ihre Eingabe interessiert sind, verwenden print mit end='':

print('How far to shift? ', end='') 
n = int(sys.stdin.readline()) 
print('Text to encode? ', end='') 
txt = sys.stdin.readline() 
... 
Verwandte Themen