2012-03-29 16 views
2

Der Versuch, einen Code in dem Moment zu schreiben, der grundsätzlich prüft, ob der Buchstabe, der bei r liegt (also hier (2,3)), gleich einem bestimmten Buchstaben oder einer Zeichenfolge ist.String-Index außerhalb des Bereichs Python

def test(): 

txt = "test.txt" 
r = (2,3) 
if txt[r[0]][r[1]] == 'l': 
    return (True) 
elif txt[r[0]][c[1]] == "m": 
    return (False) 
elif txt[r[0]][c[1]] == "b": 
    return (True) 

Aber ich bekomme immer einen Fehler. Der Fehlerdialog ist folgendes:

Ich habe keine Ahnung, was ich falsch mache, wenn man bedenkt, dass ich heute früher arbeiten musste. Auch, bevor Sie fragen, muss ich es aus einem bestimmten Grund so codieren.

Danke.

+0

Warum verwenden Sie '(2,3)' statt '2' als Index ? - und was ist 'c'? – Kimvais

+0

Vielen Dank für die Hilfe Jungs. – Hoops

Antwort

4

Bitte beachten Sie,

if txt[r[0]][r[1]] == 'l': 

sollte als

if txt[r[0]:r[1]] == 'l': 
geschrieben werden

und ähnlich andere Verwendung sollte geändert werden

+0

whoops false one – Hoops

3

Was versuchen Sie zu tun? Was wäre deine Rückkehr?

Der Grund ist es nicht, dass dies funktioniert:

r = (2,3) 
txt[r[0]][r[1]] -> txt[2][3] 

txt[2] == 's' 
s[3] -> IndexError 

Wie bereits erwähnt durch @Abhijit, wenn Sie versuchen, den Charakter, indem Sie ein Stück zu packen, dann

txt[r[0]:r[1]] is correct. 

jedoch Wenn Sie immer ein Stück machen, das ein Zeichen einnimmt, dh Ihr r-Tupel hat immer die Form (N, N + 1), wie (2, 3), dann sollten Sie vielleicht Ihre Strategie ändern.

Beachten Sie, dass für die gegebene Beispiel könnten Sie tun:

if any([letter in txt for letter in ['l', 'b']]): 
    return True 

Wenn Sie für die tatsächlichen Scheiben im Text und nicht nur ein einzelnes Zeichen zu überprüfen, dann die oben immer noch funktionieren.

if any([letter_group in txt for letter_group in ['te', 'st']]): 
    return True 

oder sogar:

if any([letter in txt for letter in 'lb']]): 
    return True 

zum Beispiel ...

+0

Ich versuche zu testen, ob der Buchstabe in dieser Koordinate ist oder nicht. im ersten Beispiel, wo es gleich "l" ist, möchte ich, dass es True zurückgibt, wenn das bestimmte Element "l" ist – Hoops

+0

Ok, also "test.txt" ist ein _file_ nicht die Zeichenfolge? – Kimvais

+0

Richtig, wenn Sie also nur nach einem einzelnen Zeichen suchen, brauchen Sie kein Slice zu verwenden, Sie können einfach einen Index-Offset wie 'txt [r]' verwenden, wobei 'r = 2' – sberry

1

Sie müssen nicht eine Scheibe zu überprüfen, ob ein Zeichen an einem bestimmten Ort vorhanden ist. Zum Beispiel:

 
txt = 'test.txt' 
if txt[2] == 's': 
    print 'runs' 

So koordinieren, wenn Sie ist (2, 3) dann nur Sie den ersten Wert verwenden müssen:

 
txt = 'test.txt' 
coord = (2, 3) 
if txt[coord[0]] == 's': 
    print 'runs' 
+0

Während ich Ihnen zustimme, dass ein Slice nicht benötigt wird, wenn der Bereich immer die Form (N, N + 1) ist, wenn dies nicht der Fall ist, oder das OP nach Übereinstimmungen mit mehreren Zeichen suchen muss, wird immer noch ein Slice benötigt . – sberry

+0

@sberry: Wahr in der Tat, die Scheibe Ansatz ist in diesem Fall immer noch benötigt. –

Verwandte Themen