2016-10-02 13 views
0

文字列が互いに部分文字列であるかどうかをチェックする簡単なプログラムを書いた。問題は、範囲外のリストインデックスを取得し続けることです。インデックスが範囲外になっていても表示されない

各繰り返しでiとjを印刷しようとしましたが、決してリストの境界から外れません。私はインデックスをチェックするためにs [5]とs [6]に要素を挿入しようとしましたが、同じエラーが発生しました。このエラーの原因は何ですか?

s = []           
s.insert(0,str("a b c")) 
s.insert(1,str("a b c d")) 
s.insert(2,str("a b")) 
s.insert(3,str("b c")) 
s.insert(4,str("d")) 

j = 0 
i = 0 

while j < 5: 
    if s[j] in s[i]: 
     print("\"" + s[j] + "\" is in the string \"" + s[i] + "\"") 
    i +=1 
    if i == 5 and j < 4: 
     j+=1 
     i=0 

これは私のコンソール出力

Traceback (most recent call last): 
"a b c" is in the string "a b c" 
    File "C:/Users/Kal/PycharmProjects/untitled/FSS2.py", line 16, in <module> 
"a b c" is in the string "a b c d" 
    if s[j] in s[i]: 
"a b c d" is in the string "a b c d" 
IndexError: list index out of range 
"a b" is in the string "a b c" 
"a b" is in the string "a b c d" 
"a b" is in the string "a b" 
"b c" is in the string "a b c" 
"b c" is in the string "a b c d" 
"b c" is in the string "b c" 
"d" is in the string "a b c d" 
"d" is in the string "d" 

Process finished with exit code 1 
+0

リストの最後に追加するには、単に「.append」する必要があることに注意してください。 – jonrsharpe

+0

'print(i、j)'はあなたのループの始めにはっきりしています。あなたは 'i == 4とj <4:'ならどうかチェックしなければなりません –

+0

@PadraicCunningham私はそのチェックを使ってみましたが、まだ同じエラーが出ます – user6912880

答えて

0

あなたのコードが例外を上げている時点で、iの値が5あるとjの値は、あなたがs[5]すなわちs[i]をしようとあなたのprint声明4.であり、Sの最大インデックスは4ているので、あなたのコードはIndexErrorに上がっています。

私はあなたのコードであなたのようにあなたのif文で修正を行う行う必要があり、信じている:そして、あなたのコードが正常に動作

if i == 5 and j < 5: # Instead of j < 4 

>>> while j < 5: 
...  if s[j] in s[i]: 
...   print("\"" + s[j] + "\" is in the string \"" + s[i] + "\"") 
...  i +=1 
...  if i == 5 and j < 5: 
...   j+=1 
...   i=0 
... 
"a b c" is in the string "a b c" 
"a b c" is in the string "a b c d" 
"a b c d" is in the string "a b c d" 
"a b" is in the string "a b c" 
"a b" is in the string "a b c d" 
"a b" is in the string "a b" 
"b c" is in the string "a b c" 
"b c" is in the string "a b c d" 
"b c" is in the string "b c" 
"d" is in the string "a b c d" 
"d" is in the string "d" 
+0

これが望ましい出力でない場合は、質問を目的の出力に更新してください。あなたのコードが何を実行すべきかを推測するのは難しいです。 –

+0

これは確かに望ましい出力です(私はユーザー入力部分文字列チェッカーのロジックエラーを修正するためにこれを使用していました) – user6912880

0

であるあなたは、私はすでに5のときだけ(IF-句でandに気づく)Jを増やしているようです。したがって、i = 5のときはまだwhileループ(jに依存する)にあり、未定義のs [i] = s [5]にアクセスしようとします。

+0

PythonはJavascriptではありません。未定義はありません。IndexErrorです。 –

+0

そうですが、私は[5]が値 "未定義"を保持していると言っているわけではありません。それに関連する価値がないということだけ。 – imant

+0

私はそれをして、各項目が他の項目と照合されるようにしました。私はインデックスとして使用される前から0にリセットされているので、これは非問題ではありませんか?また、s [5]とs [6]で要素を追加したときに、エラーを取り除くべきではないでしょうか? – user6912880

1

問題はラインで18

あります
s = []           
s.insert(0,str("a b c")) 
s.insert(1,str("a b c d")) 
s.insert(2,str("a b")) 
s.insert(3,str("b c")) 
s.insert(4,str("d")) 
print(s) 
j = 0 
i = 0 

while j < 5: 
    if s[j] in s[i]: 

     print("\"" + s[j] + "\" is in the string \"" + s[i] + "\"") 
    i +=1 
    if i == 5 and j < 4: <-- here 
     j+=1 
     i=0 

ある時点で、i = 5j = 4、このif i == 5 and j < 4文の右辺がFalseされ、そしてiだから次のループで0にresetedされていないので、iは5に等しく、最大のインデックスが4

より良い解決策があるだろうforループを使用すること。

s = []           
s.insert(0,str("a b c")) 
s.insert(1,str("a b c d")) 
s.insert(2,str("a b")) 
s.insert(3,str("b c")) 
s.insert(4,str("d")) 
for i in range(len(s)): 
    for j in range(len(s)): 
     if s[i] in s[j]: 
      print("\"" + s[i] + "\" is in the string \"" + s[j] + "\"") 

編集whileループで

s = []           
s.insert(0,str("a b c")) 
s.insert(1,str("a b c d")) 
s.insert(2,str("a b")) 
s.insert(3,str("b c")) 
s.insert(4,str("d")) 
j = 0 
i = 0 

while j < len(s): 
    if s[j] in s[i]: 
     print("\"" + s[j] + "\" is in the string \"" + s[i] + "\"") 
    i +=1 
    if i == len(s): 
     j+=1 
     i=0 
+1

あるいは、リストの理解を使用して最後にリストを印刷することもできます。 (len(s))のjの範囲(len(s))のiに対して、{{"{0}は文字列{1}"にあります。if(j)、s [i] s [i]] ' – TheF1rstPancake

+1

なぜ、私は学習している人のコードを完全に変更しようとしていないのですか?リストの理解や既存の図書館の使用方法はわかっているのは明らかですが、重要な点は彼がいないことです。このようにする方が良いと思います。 – Nf4r

+0

解決策が間違っているとは言わなかったので、コメントを残しました。それを行う別の方法。 – TheF1rstPancake

0

あなたのiとjの変数が間違っているコメントに答えるために。コードの次の値を変更した後に動作しています。あなたのフォームを維持

s = []           
s.insert(0,str("a b c")) 
s.insert(1,str("a b c d")) 
s.insert(2,str("a b")) 
s.insert(3,str("b c")) 
s.insert(4,str("d")) 

print s 

j = 0 
i = 0 

while j < 5: 
    if s[j] in s[i]: 
     print("\"" + s[j] + "\" is in the string \"" + s[i] + "\"") 
    i +=1 
    if i == 4 and j < 5: 
     j+=1 
     i=0 
0

それは次のようになります。

s = []           
s.insert(0,str("a b c")) 
s.insert(1,str("a b c d")) 
s.insert(2,str("a b")) 
s.insert(3,str("b c")) 
s.insert(4,str("d")) 

j = 0 
i = 0 

while j < 5: 
    if s[j] in s[i]: 
     print("\"" + s[j] + "\" is in the string \"" + s[i] + "\"") 
    i +=1 
    if i == 5 and j <= 4: 
     j+=1 
     i=0 

あなたwhileループ内であれば、エラーが第二です。機能させるには、j <= 4またはj < 5にする必要があります。

関連する問題