2017-06-08 12 views
1

を:私は(アレイ内の特定の要素を検索しようとしていますPythonで2次元配列を検索 - 私はPythonで、次の2次元配列(リストのリスト)を作成した最善の方法+インデントエラー

#creating a 2d array (3 rows by 7 columns) and populating it with numbers 
matrix=[1,2,3,4,5,6,7],[8,9,10,11,12,13,14],[15,16,17,18,19,20,21] 
rows=len(matrix) #finding the max number of rows in the matrix, in this case 3 
columns=len(matrix[0]) #finding the max number of columns in each row, 7 in this case 

)番号9を言うし、次に見つかった場合、「見つかった」、および「見つかりません」、そうでない場合、アレイに、次のコードで印刷:

number=int(input("What number are you looking for?")) 
for i in range(rows): 
     for j in range(columns): 
     if matrix[i][j]==number: 
      print("Found it!") 
      break 
else: 
    print("not found") 

出力しかし、誤っている:

>>What number are you looking for? 9 
>>Found it! 
>>not found 

私は2つの質問があります。1.誰かがこの問題を参照して識別情報を明確に説明でき、なぜ2番目の「見つからない」が常に出力されるのか? 2. numpyを使用しないでこれを行うより効率的な方法がありますか?

注:これは重複していません。私は他のエントリを検索しています。明示的に尋ねる

ここrepl.it: https://repl.it/IcJ3/3

誰かが以下のように答えを示唆した。(私はすでにこれをしようとした)

https://repl.it/IcJ3/5 注意、それはすべてのいずれかで動作しません:

number=int(input("What number are you looking for?")) 
for i in range(rows): 
     for j in range(columns): 
     if matrix[i][j]==number: 
      print("Found it!") 
      break 
     else: 
      print("not found") 

誤った出力、まだ!

What number are you looking for? 9 
not found 
not found 
not found 
not found 
not found 
not found 
not found 
not found 
Found it! 
not found 
not found 
not found 
not found 
not found 
not found 
not found 
+1

あなたの他にif文のインデントに一致しません。 – Zeokav

+1

ここにはどんなステートメントがありますか? –

+0

私は、他の人のために異なるポジション/アイデンティティで遊んでいます:....それは私が助けを必要とするものです。もし私が知っていたら、私は尋ねていないだろう!ありがとうございます事前に – MissComputing

答えて

1

あなたはPythonの初心者です。この言語では、コードブロックは命令の前にあるインデントの数によって識別されます。あなたのケースでは、ifステートメントがありますが、elseはそのifステートメントのインデントに一致していません。
あなたはあなたのコードはこのような何かになりたいと思います - これはあなたが必要と何をすべき

number=int(input("What number are you looking for?")) 
flag = False 
for i in range(rows): 
     for j in range(columns): 
     if matrix[i][j]==number: 
      print("Found it!") 
      flag = True 
      break 
if flag == False: 
    print ("Not found!") 
+0

あなたが入力したものはまったく動作しません - 以前のものです実装しようとしました:エラー:あなたは何を探していますか? 9 が見つからない は が はそれを見つけたが見つからない見つからない見つからない見つからない見つからない見つからない見つかりません! が、私はそうは思わない – MissComputing

+0

を見つけていない見つからない見つからない見つからない見つからない見つからない見つかりません。 'else'が' if'とマッチした場合、探しているものと等しくないすべての要素に対して "not found"が出力されます。それは明らかにOPが求めていたものではない。 –

+0

はい、番号と印刷が不一致であるたびに見つからないことを確認しています。私は私の答えを変更します。 – Zeokav

0

matrix=[[1,2,3,4,5,6,7],[8,9,10,11,12,13,14],[15,16,17,18,19,20,21]] 
x = 93 
bool_value = [True if x in mat else False for mat in matrix] 
print('Found' if any(bool_value) else 'Not found') 

注:any()リスト中の少なくとも1つの値がtrueの場合Trueを返します。 Pythonのくぼみにも C/C++

if(condition){ 
do a thing 
} 
else{ 
do something else 
} 

しかし、Pythonのくぼみのブロックseperators

if (condition): 
    do a thing 
else: 
    do something else 

4つの空白又はタブ行為としてとして働く、例えばブロックseperatorsとして 作用ブロックセパレータ。私は

if (condition): 
++++do a thing 
else: 
++++if (another_condition): 
++++++++do_stuff 
++++else: 
++++++++do_some_other_stuff 
print("Exited from nested if/else loops") 

(これはただの目的を理解するためである)+で空白を表現するためだったのであればあなたは右のアイデアを得ますか?あなたのコードにインデントが適切でないため、毎回not foundが印刷されます。

EDIT:コメント[True if x in mat else False for mat in matrix]で述べたようには[x in mat for mat in matrix]のように記述することができる。しかし、あなたは、Pythonに新しいしているので、それはあなたの理解のためであると私はそれを残します。

+2

これは良い解決策ですが、「x in mat else else False」が過度に複雑なバージョンですはるかに単純な「x in mat」です。 –

+0

男性を指摘してくれてありがとう。 – void

1

ここでの主な問題は、breakが最も内側のループを終了することです。要素が見つかった場合、breakは同じ列の他の要素のチェックをスキップしますが、外側のループは次の行に進みます。何が本当に欲しいのはどちらかで、この:それはちょうど私に起こった:編集

def searchfor(matrix, number): 
    for row in matrix: 
     for element in row: 
      if element == number: 
       return True 
    return False 

if searchfor(matrix, number): 
    print("Found") 
else: 
    print("Not found") 

found = False 
for row in matrix: 
    for element in row: 
     if element == number: 
      found = True 
      break 
    if found: 
     break 
if found: 
    print("Found") 
else: 
    print("Not found") 

は、おそらく、機能を使用して、より読みやすいソリューションを (他のブレークに気づく)またはフラグ変数または関数のいずれかを指定せずに書き込むことは可能ですが、それは特にエレガントな方法ではありません。それでも、完全を期すために、ここにいます:内部ループbreakで終了しなかった場合にのみ

for row in matrix: 
    for element in row: 
     if element == number: 
      break 
    else: 
     continue 
    break 

if element == number: 
    print("Found") 
else: 
    print("Not found") 

continue文が実行され、それが次の行に外側のループを進めます。それ以外の場合は、2番目のbreakは外側のループを終了します。

0
matrix =[1,2,3,4,5,6,7],[8,9,10,11,12,13,14],[15,16,17,18,19,20,21] 

def search_elm(arr, num): 
    elm = False 
    for i in range(len(arr)): 
     for j in range(len(arr[0])): 
     if arr[i][j] == num: 
      elm = True 
    return elm 

とあなたが好きそれを使用することができます。

if search_elm(matrix, 44): 
    print 'Found!' 
else: 
    print 'Not Found' 
+0

elmとは何ですか... – MissComputing

+0

単語 'element'へのショートカット –

+0

この解決策の問題は、最初のものがヒットしたとしても、マトリックスのすべての**要素をチェックすることです。大きな行列に対しては非効率的です。 –

0

あなたが探しているすべての値をマトリックス状に存在する場合、私は別のルートを行くとある場合:

import itertools 

matrix=[ 
    [1,2,3,4,5,6,7], 
    [8,9,10,11,12,13,14], 
    [15,16,17,18,19,20,21], 
     ] 

unique_elements = set(itertools.chain(*matrix)) 
in_matrix = lambda a, set: a in set 

print(in_matrix(3, unique_elements)) #True