2017-06-08 5 views
1

J'ai créé le suivant tableau 2d (liste des listes) en Python:la recherche d'un tableau 2D en python - meilleure méthode + erreur d'indentation

#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 

Je suis en train de rechercher un élément spécifique dans le tableau (dire le numéro 9), puis imprimer « trouvé », se trouve, et « introuvable », sinon dans le tableau, avec le code suivant:

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") 

la sortie cependant, est erronée:

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

J'ai deux questions: 1. Quelqu'un pourrait-il expliquer clairement l'identité, en faisant référence à ce problème et pourquoi le second "non trouvé" est toujours sorti. 2. Y a-t-il une meilleure façon plus efficace de faire cela, sans l'utilisation de numpy

* note, ce n'est pas un doublon, comme j'ai cherché les autres entrées et ils ne traitent pas tout à fait ce que je suis demander explicitement.

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

Quelqu'un vient de suggérer une réponse comme ci-dessous: (je l'avais déjà essayé)

https://repl.it/IcJ3/5 Remarque, cela ne fonctionne pas du tout soit:

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") 

Sortie erronée, toujours!

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

Votre autre ne correspond pas à l'indentation de l'instruction if. – Zeokav

+1

pour quelle affirmation ici est autre:? –

+0

J'ai joué avec différentes positions/identités pour l'autre: .... c'est ce dont j'ai besoin d'aide. Si je le savais, je ne le demanderais pas! Merci d'avance – MissComputing

Répondre

1

Vous semblez être nouveau sur Python. Dans ce langage, les blocs de code sont identifiés par le nombre de retraits que vous avez avant une instruction. Dans votre cas, vous avez une instruction if, mais votre else ne correspond pas à l'indentation de cette instruction if.
Vous voudriez que votre code soit quelque chose comme ça -

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

Ce que vous venez d'entrer ne fonctionne pas du tout - c'est un précédent mise en œuvre que j'avais essayé: Erreur: Quel numéro cherchez-vous? 9 introuvable introuvable introuvable introuvable introuvable introuvable introuvable pas trouvé Je l'ai trouvé! introuvable introuvable introuvable introuvable introuvable introuvable introuvable – MissComputing

+0

Je ne pense pas. Si ce 'else' correspond à' if', "not found" serait imprimé pour chaque élément qui n'est pas égal à celui recherché; ce n'est clairement pas ce que le PO demandait. –

+0

Oui, il vérifie le nombre et l'impression non trouvée chaque fois qu'elle est inégale. Je vais modifier ma réponse. – Zeokav

0

Cela devrait faire ce que vous avez besoin!

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') 

Note:any() retours True si atleast une valeur dans la liste est vraie. également dans des indentations python agissent comme séparateurs de bloc Par exemple, dans c/C++

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

Mais indentations python agissent comme séparateurs de bloc

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

quatre espaces blancs ou un onglet agit comme Séparateurs de blocs. Donc, si je devais représenter les espaces blancs avec + (Ceci est juste à des fins de compréhension)

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

Vous obtenez la bonne idée? Et l'indentation n'est pas correcte dans votre code, c'est pourquoi chaque fois not found est imprimé.

EDIT: Comme mentionné dans les commentaires [True if x in mat else False for mat in matrix] peut être écrit comme [x in mat for mat in matrix] Mais je vais le laisser tel qu'il est pour votre compréhension puisque vous êtes nouveau python.

+2

Ceci est une bonne solution, mais 'True si x dans mat else False' est une version trop compliquée de beaucoup plus simple 'x in mat'. –

+0

Merci de m'avoir signalé l'homme. – void

1

Le problème principal ici est que break ne sort que de la boucle la plus intérieure. Donc, si un élément est trouvé, break passera la vérification des autres éléments dans la même colonne, mais la boucle externe continuera à la ligne suivante. Qu'est-ce que vous voulez vraiment est soit ceci:

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") 

(remarquez l'autre pause) ou, éventuellement, une solution plus facile à lire en utilisant une fonction:

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") 

Edit: Il vient est survenue me qu'il est possible de l'écrire sans une variable de drapeau ou une fonction, mais ce n'est pas une manière particulièrement élégante. Pourtant, pour être complet, vous êtes ici:

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

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

La déclaration continue exécutera que si la boucle intérieure n'a pas été par break sorti, et il avancera la boucle extérieure à la ligne suivante; sinon, la seconde break terminera la boucle externe.

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 

et vous pouvez l'utiliser comme:

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

qu'est-ce que l'orme ... – MissComputing

+0

Juste un raccourci vers le mot 'élément' –

+0

Le problème avec cette solution est qu'elle va vérifier ** tous ** les éléments dans la matrice même si le premier était un coup. Inefficace pour les grandes matrices. –

0

Si tout ce que vous recherchez est si la valeur existe dans la matrice j'emprunter une autre voie:

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