python - 在python中处理二维列表边界检查的最佳方法?
问题描述
我有一个如下所示的二维列表,如果单元格周围的单元格为 0,我想将单元格值从 1 更改为 0
from
[
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
]
To
[
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
]
我想我可以使用 8 个 if/else 逻辑来检查,但想知道是否有更好或更干净的方法来做到这一点?
解决方案
我将使用 python 生成器来获取有效的邻居,并使用all
来检查所有邻居是否为零。
def update_cell(grid):
if not grid or not grid[0]:
return
m, n = len(grid), len(grid[0])
def is_valid(i, j):
return 0 <= i < m and 0 <= j < n
def neighbors(i, j):
for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0), (-1, 1), (-1, -1), (1, -1), (1, 1)]:
ni, nj = i+di, j+dj
if is_valid(ni, nj):
yield ni, nj
for i in range(m):
for j in range(n):
if grid[i][j] and all(not grid[ni][nj] for ni, nj in neighbors(i, j)):
grid[i][j] = 0
if __name__ == "__main__":
grid = [
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
]
update_cell(grid)
print(grid)
# prints
#[[0, 0, 1, 0, 0],
# [0, 0, 1, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0]]
推荐阅读
- c# - C# 异步任务
返回对象 - .net - 在 where 子句中使用非集群索引而不是索引查找时,MS SQL 执行计划中的索引扫描
- aws-lambda - “无服务器部署”不适用于 –aws-profile 选项,并且没有错误可调试
- c# - 使用文本提取器后,U-SQL 忽略在 JsonFunctions.JsonTuple() 中导致 JSON 异常的行
- amazon-cloudformation - 通过控制台更新到通过 CLI 使用相同的 json 更新时 AWS Cloudformation 堆栈的差异
- r - 使用平方函数选择列表中的元素
- javascript - 轻量级前端本地化
- javascript - 嵌套数组中的 Lodash 映射值
- r - 如何使用 tableGrob 显示表格的标题?
- php - PHP - 多线程和池