2016-11-14 50 views
0

因此,在一个列表中,我需要检查'z'是否与所选情况位于同一行,并返回True,但是如果某事正在运行,例如'x',它将返回False。我做了一个代码,但它存在的问题是,如果有两个'z',左边的那个被'x'阻塞,但另一个不是,它返回False,但它应该是True。它适用于其他情况。希望你得到我,我很难解释这些事情。Python列表检查

def row(lst,i,j): 
    c = 0 
    if 'z' not in lst[i]: 
     c += 1 
    else: 
     for n in range(0,len(lst[i])): 
      if lst[i][n] == 'z' and n > j: 
       for m in range(j,n): 
        if lst[i][m] == 'x': 
         c += 1 
        else: 
         c = 0 
       break 

      if lst[i][n] == 'z' and j > n: 
       for m in range(n,j): 
        if lst[i][m] == 'x': 
         c += 1 
        else: 
         c = 0 
       break 

    if c > 0: 
     return False 
    elif c == 0: 
     return True 

我真的不知道究竟是什么“突破”在这里,但它的工作原理 我使用的列表是:

lst = [['_','_','_','_','_'],['z','x','_','_','z'],['_','_','x','_','_']] 

,我检查的情况为lst [1] [ 2]。

['_','x','_','_','z'] 

返回True,行中有'z'。

['_','x','_','x','z'] 

返回FALSE,z为被封锁

['z','x','_','x','z'] 

个返回False

['z','x','_','_','z'] 

问题:应该返回True

+0

你应该阅读'break'。并询问谁写了这些代码,以防你没有。 –

+0

'x'阻止'z'是什么意思? –

+0

@AndrasDeak我写了它 – bajotupie

回答

0

有该行的两半检查。 之前(i,j)和之后的一个(i,j)。

问题是,在你到达下半场之前你已经打破了。 另外,我不确定你在做什么c

无论如何,一个解决办法是这样的:

def check_row(lst, i, j): 
    if 'z' not in lst[i]: 
     return False 

    for n in range(j, 0, -1): 
     if lst[i][n] == 'z': 
      return True 
     elif lst[i][n] == 'x': 
      break 

    for n in range(j + 1, len(lst[i])): 
     if lst[i][n] == 'z': 
      return True 
     elif lst[i][n] == 'x': 
      break 

    return False 

的想法是看从目标值。 首先,我们从目标循环到行的前面,然后从目标循环到行的结尾。在任何时候,如果遇到'z',我们立即返回True。如果它遇到'x',我们打破这个方向的搜索。我们被封锁了。

如果我们到达最后,意味着我们没有找到'z',所以我们返回False。

这可能会缩短得多,但这个基本版本应该可以工作。

+0

非常感谢,我实际上已经找到了一个解决方案,增加了另一个循环,但它给了我另一个问题哈哈。如果不是found_z,会发生什么?另外,我也需要为列做这个工作,你如何检查列中是否有'z',因为你不能像连续一样做'if'z'不在lst [i]中“ 。 – bajotupie

+0

如果不是found_z部分是没有必要的。我忘了删除它。 没有简单的方法来通过列。 只需正常迭代即可。 看看答案[这里](http://stackoverflow.com/questions/9151104/how-to-iterate-through-a-list-of-lists-in-python)。 –