2012-03-29 17 views
2

現時点では、rにある文字(したがってhere(2,3))が特定の文字または文字列と等しいかどうかを確認するためのコードを書きます。文字列インデックスが範囲外にある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) 

エラーが発生します。エラーダイアログは次のとおりです。

if txt[r[0]][r[1]] == 'l': 
IndexError: string index out of range 

私はそれが今日より早く働いていたと考えて、何が間違っているのか分かりません。 また、質問する前に、私はこのように特定の理由でコードを作成する必要があります。

ありがとうございました。

+0

を(2,3)'の代わりに 'の2'指標として? - 'c'とは何ですか? – Kimvais

+0

お手伝いいただきありがとうございます。 – Hoops

答えて

4

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

if txt[r[0]:r[1]] == 'l': 
のように記述する必要があり、注意してくださいは、

と同様に他の用途を変更する必要があります

+0

whoops wrong one – Hoops

3

何をしようとしていますか?あなたの帰還は何ですか?その後、

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

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

@Abhijitで述べたように、あなたはスライスを行うことで、文字をつかむしようとしている場合、

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

しかし、:

それが動作しない理由はこれですあなたが常に1文字をつかむスライスをしているなら、あなたのrタプルは常に(N、N + 1)のようなものです(2,3)のように、戦略を変えたいかもしれません。あなたの特定のたとえばあなたができることを

注:

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

テキスト内の実際のスライスだけではなく、単一の文字をチェックする必要がある場合は、上記のはまだ動作します。

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

かさえ:例えば

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

...

+0

文字がその座標にあるかどうかをテストしようとしています。 "l"と等しい最初の例では、特定の要素が "l"の場合にtrueを返します。 – Hoops

+0

"test.txt"は文字列ではないので、 – Kimvais

+0

そうですね、1文字しか探していない場合、スライスを使う必要はありません。 'txt [r]'のようなインデックスオフセットを使うことができます。 'r = 2'の場合 – sberry

1

文字が特定の場所に存在するかどうかを確認するためにスライスする必要はありません。たとえば:あなたは座標のであれば

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

(2, 3)は、あなたが最初の値のみ使用する必要がある: `なぜあなたが使用している

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

範囲が常に(N、N + 1)形式である場合はスライスが必要ではないことに同意しますが、そうでない場合、またはOPが複数文字の一致をチェックする必要がある場合、スライスはまだ必要です。 – sberry

+0

@sberry:確かに、実際にはスライスのアプローチが必要です。 –

関連する問題