2017-06-08 18 views
1

我已经创建了如下二维数组(名单列表):搜索在python的二维数组 - 在Python最好的方法+缩进错误

#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 

我有两个问题:1.有人可以清楚地解释身份,参考这个问题以及为什么第二个“找不到”总是输出。 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()返回True如果在列表中ATLEAST一个值是true。 同样在蟒凹痕充当块分隔符 例如,在C/C++

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

但是在Python凹痕充当块分隔符

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

其中4空格标签充当块分离器。所以如果我用+代表空白(这只是为了理解目的)

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的原因。

编辑:正如评论[True if x in mat else False for mat in matrix]可以写为[x in mat for mat in matrix]提及,但我会离开它,因为它是你的理解,因为你是新的蟒蛇。

+2

这是一个很好的解决方案,但是'如果x in mat else False'是一个过于复杂的版本简单得多'x in mat'。 –

+0

感谢您指出男人。 – void

1

这里的主要问题是break只能退出最里面的循环。所以,如果找到一个元素,break将跳过检查同一列中的其他元素,但外层循环仍会前进到下一行。你真正想要的是什么或者是这样的:

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

(注意其他休息时间) 或可能的话,使用功能更可读的解决方案:

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

编辑:它只是发生在我可以在没有标志变量或函数的情况下编写它,但这不是一个特别优雅的方法。尽管如此,完整性,你在这儿:

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语句将执行仅在内环不是通过break退出,这将推进外环到下一行;否则第二个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

什么是榆树...... – MissComputing

+0

仅仅是一个'元素'这个词的快捷方式 –

+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