2017-10-28 26 views
2

我有我需要創建一個函數來解決給定的座標x的嵌套列表N爲(忍者)的數量,Y的一個問題:如何計算在嵌套列表中選擇特定的鄰居在Python 3

ninjas = [['N', ' ', ' ', ' ', ' '], 
     ['N', 'N', 'N', 'N', ' '], 
     ['N', ' ', 'N', ' ', ' '], 
     ['N', 'N', 'N', ' ', ' '], 
     [' ', ' ', ' ', ' ', ' '], 
     [' ', ' ', ' ', ' ', ' ']] 

所以,如果我的座標是x = 1和y = 2,那麼函數應該返回8(圍繞座標的忍者數量)。我已經連續48小時與這個問題作鬥爭,我無法理解這一點。該解決方案不應該包含任何奇特的numpy.imports。只有基本的for-loops和...

我應該如何處理這個問題?任何提示?

+0

幫助我們回答您的問題提供你的代碼」至今已寫入 - 謝謝! –

+0

問題是,我還沒有得到任何關於這個功能的任何事情。只是似乎無法擺脫它。我寫的所有函數都是向用戶提供x和y座標,並檢查它們是否超出範圍。 – teepa

回答

1

WAY超過每line限制PEP-879字符,但這裏是我的one-line解決方案:

def surrounding(ninjas, x, y): 
    return [ninjas[r][c] for r in range(y-1 if y > 0 else y, y + 2 if y < len(ninjas)-1 else y + 1) for c in range(x-1 if x > 0 else x, x + 2 if x < len(ninjas[0])-1 else x + 1)].count('N') 

預期其工作原理:

surrounding(ninjas, 1, 2) 

這給8

surrounding(ninjas, 4, 5) 

它給出0


如果你想打破它分解成一些更可讀一點的話,這裏是一個更明智的function做的工作:

def surrounding(ninjas, x, y): 
    neighbours = [] 
    for r in range(y-1 if y > 0 else y, y+2 if y < len(ninjas)-1 else y+1): 
     for c in range(x-1 if x > 0 else x, x+2 if x < len(ninjas[0])-1 else x+1): 
     neighbours.append(ninjas[r][c]) 
    return neighbours.count('N') 

注意,這兩種解決方案依賴於ninjaslistrectangular


他們是如何工作的

以同樣的方式無論functions工作,只是一個被塞進list-comprehension和其他appendsneighbours一個list

用於計算周邊忍者是如下的步驟:

  1. 初始化一個list存儲cell值/
  2. 環路穿過2d-list從上面1rows如果有上述其他沒有牆壁從下面的輸入位置到1,如果有...
  3. 循環通過columns內部當前row1到左邊如果沒有其他牆從輸入...
  4. 添加一個cellneighbourslist
  5. 返回多少忍者都在neighbourslist使用.count('N')

還有一點要注意的是,這個問題可以在一個稍微不同的方式加以處理。除了每cell增加list並且在那個list中計算忍者,我們可以代之以將1添加到變量,如果那個cell是忍者。

操作的代碼如下所示:

def surrounding(ninjas, x, y): 
    noNinjas = 0 
    for r in range(y - 1 if y > 0 else y, y + 2 if y < len(ninjas) else y + 1): 
     for c in range(x - 1 if x > 0 else x, x + 2 if x < len(ninjas) else x + 1): 
     if ninjas[r][c] == 'N': 
      noNinjas += 1 
    return noNinjas 
+0

這似乎是工作,非常感謝您的意見。你能否再詳述一下這裏發生的事情? – teepa

+0

@teepa只是,甚至沒有看到您的評論,已經打字了! –

+0

感謝您花時間向我解釋這一步一步。 – teepa

0

,你可以得到由ninjas[y][x]的(xy)元素,你可以簡單地檢查所有周圍的8種元素的'N'

Ns = 0 # Number of 'N's 
if ninjas[y + 1][x] == 'N': # Below 
    Ns += 1 
if ninjas[y][x + 1] == 'N': # To the right 
    Ns += 1 
if ninjas[y - 1][x - 1] == 'N': # Above to the left 
    Ns += 1 
... 

這當然可以通過利用循環更聰明地書寫,而不是手寫全部8個案例。此外,不執行邊界檢查,這意味着您可能應確保(x,y)不在您的2D數據數組的邊界上。

編輯:循環

,因爲我們需要x -1xx + 1(和y類似),我們可以使循環像這樣:

Ns = 0 
for i in range(-1, 2): 
    for j in range(-1, 2): 
     if i == j == 0: 
      # This is just the (x, y) element itself. Skip it 
      continue 
     if ninjas[y + i][x + j] == 'N': 
      Ns += 1 
+0

並檢查「x + 1」,「x-1」,「y + 1」,「y-1」是否在相應的範圍內。 –

+0

感謝您的輸出。你能否詳細說明我應該如何創建這些循環? – teepa

+0

@teepa查看最新的答案。 –