2017-10-28 25 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查看最新的答案。 –