如何计算Python 3中嵌套列表中的特定邻居

时间:2017-10-28 21:02:52

标签: arrays python-3.x list

我有一个问题,我需要创建一个函数来解决给定坐标x,y的嵌套列表中N(ninjas)的数量:

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

因此,如果我的坐标是x = 1且y = 2,则函数应返回8(坐标周围的ninjas数)。我已经连续48个小时与这个问题作斗争了,我无法理解这个问题。解决方案不应包含任何花哨的numpy.imports。只有基本的for循环和......

我该如何处理这个问题?任何提示?

2 个答案:

答案 0 :(得分:2)

WAY 超过PEP-8 79个字符line个限制,但这是我的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')

请注意,这两种解决方案都依赖于ninjas listrectangular

他们的工作方式

两个functions都以相同的方式工作,只有一个被塞进list-comprehension而另一个被appends加到list neighbours

计算周围忍者的步骤如下:

  1. 初始化list以存储cell值/
  2. 如果有......,如果从输入的位置到下方的rows以上没有其他墙,则从2d-list的{​​{1}}循环1 / LI>
  3. 如果输入的其他墙没有其他墙,则从1左侧columns内的row循环播放......
  4. 1添加到cell neighbours
  5. 使用list
  6. 返回neighbours list中有多少忍者

    还有一点需要注意的是,这个问题可能会以稍微不同的方式来解决。我们可以将.count('N')添加到变量cell,而不是将每个 list添加到list并计算1中的Ninjas。 {1}}是忍者。

    代码如下:

    cell

答案 1 :(得分:1)

由于您可以x获取(yninjas[y][x])元素,因此您只需检查'N'的所有8个周围元素:

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个案例来更巧妙地编写。此外,不执行边界检查,这意味着您可能应确保(xy)不在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