首页 > 解决方案 > 在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 逻辑来检查,但想知道是否有更好或更干净的方法来做到这一点?

标签: pythonpython-3.x

解决方案


我将使用 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]]

推荐阅读