2016-09-22 19 views
-2

項目がリストは、リスト内の文字列を見つけ、インデックスまたは-1

def ser(a,b): 
    for j in a: 
     if j == b: 
      return (a.index(b)) 
     else: 
      return -1 

print (ser([1,2,3],3)) 

にそれはいつも私を返しますない場合は-1項目または-1のインデックスを返す手続きを定義するそれを返します。もし私が 'else'部分をカットすると、それは動作します。なぜ ?

+3

はA' 'の最初の要素が等しくない 'B'をした場合に何が起こるか、それについて考えてみよう。 –

+1

関数は最初に失敗した検索の後に-1を返します。 – Kasramvd

答えて

1

elseブロックは、最初の反復がj == bを満たさない場合に実行されます。

あなたはforループが疲れ後にアイテムが見つからない場合は実行forに他のブロックを移動する方がいいでしょう:

def ser(a,b): 
    for j in a: 
     if j == b: 
      return (a.index(b)) 
    else: # or put default return on this line 
     return -1 

さらに重要なことは、あなたも使って封じ込めのためにチェックすることができb in aリストを反復する必要はありません。

2

これは、初めてループ内の条件と一致しないため、すぐに戻りメソッドを終了するためです。一致していないときに何をしたいのかを判断するには、ここでロジックを再検討する必要があります。最終的には、小切手を使い切るまでループを続けたいと思っています。

ループの外にreturn -1を設定するだけです。あなたの全体のループを通過した場合、あなたはあなたの試合を発見していないので、あなたは、返すことができます-1

def ser(a,b): 
    for j in a: 
     if j == b: 
      return (a.index(b)) 
    return -1 

print (ser([1,2,3],3)) 

また、ループがinを使用することによって回避することができます。だから、あなたが実際にこれにあなたの方法を再度書き込むことができます。

def ser(a, b): 
    if b in a: 
     return a.index(b) 
    return -1 

あなたはそれがある場合に、アイテムbは、リストaである場合、参照インデックスを返し、そうでない場合は-1を返します

にするためにチェックしていますさらに簡素化を取る、あなたが実際にあなたのreturn内の1行にしてこれを設定することができます

def ser(a, b): 
    return a.index(b) if b in a else -1 
0

forループの最初の反復では、配列の最初の要素をbと等しい場合、それはテストします。そうではないので、コードは配列の他の要素をテストすることなく直ちに-1を返します。あなたのケースでは

、正しいコードは次のとおりです。このように

def ser(a,b): 
    for j in a: 
     if j == b: 
      return (a.index(b)) 
    return -1 

、コードは、配列のすべての要素をしようとすると、-1を返しますそれらのどれもBに等しいない場合。

0

あなたは空想、簡単なワンライナーが動作する何もする必要はありません。

def ser(a,b): 
    return a.index(b) if b in a else -1 

# Example 
my_list = [1, 2, 3, 4] 
ser(my_list, 2) 
# returns: 1 

ser(my_list, 8) 
# returns: -1 
関連する問題