我有一个问题,我需要创建一个函数来解决给定坐标 x、y 的嵌套列表中 N(忍者)的数量:
ninjas = [['N', ' ', ' ', ' ', ' '],
['N', 'N', 'N', 'N', ' '],
['N', ' ', 'N', ' ', ' '],
['N', 'N', 'N', ' ', ' '],
[' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ']]
因此,如果我的坐标为 x=1 且 y=2,则该函数应返回 8(该坐标周围的忍者数量)。我已经与这个问题斗争了 48 个小时,但我无法解决这个问题。该解决方案不应包含任何花哨的 numpy.imports。只有基本的 for 循环和...
我应该如何处理这个问题?有什么提示吗?
最佳答案
方式超过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
值(value)观/ - 循环
rows
在2d-list
来自1
如果从输入位置到1
上方没有墙壁,则位于上方下面如果有... - 循环
columns
当前row
内来自1
如果进入的地方没有其他墙壁,则向左... - 添加
cell
到neighbours
list
- 返回
neighbours
中有多少个忍者list
使用.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
关于arrays - 如何在 Python 3 中计算嵌套列表中的特定邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46994453/