我有一个问题,我需要创建一个函数来解决给定坐标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循环和......
我该如何处理这个问题?任何提示?
答案 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
list
为rectangular
他们的工作方式
两个functions
都以相同的方式工作,只有一个被塞进list-comprehension
而另一个被appends
加到list
neighbours
。
计算周围忍者的步骤如下:
list
以存储cell
值/ rows
以上没有其他墙,则从2d-list
的{{1}}循环1
/ LI>
1
左侧columns
内的row
循环播放...... 1
添加到cell
neighbours
list
neighbours
list
中有多少忍者
醇>
还有一点需要注意的是,这个问题可能会以稍微不同的方式来解决。我们可以将.count('N')
添加到变量cell
,而不是将每个 list
添加到list
并计算1
中的Ninjas。 {1}}是忍者。
代码如下:
cell
答案 1 :(得分:1)
由于您可以x
获取(y
,ninjas[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个案例来更巧妙地编写。此外,不执行边界检查,这意味着您可能应确保(x
,y
)不在2D数据阵列的边界上。
由于我们需要x -1
,x
和x + 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