2016-11-14 51 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)。 –