首页 > 解决方案 > 如何在嵌套列表中获取小于周围的值的值

问题描述

所以基本上我必须在嵌套列表中找到与其周围的数字相比最小的数字。这将被称为“接收器”,如果它是接收器,则该函数返回 True,否则返回 False。例如,如果嵌套列表是

[[1, 2, 1],
 [4, 6, 5],
 [7, 8, 9]]

那么 [0,2], (1) 处的数字应该为真,因为与其相邻的所有值都小于 1,但 [2, 0], (7) 处的数字不应该为真大于它周围的一些值。

我尝试使用切片来获取旁边的数字,但我不知道如何切片以从水槽或上方或下方获取对角线的数字。这是我尝试做的一些代码:

for x in elevation_map:
    for xs in x:
        if elevation_map[cell[0]][cell[1]] < xs[cell[0]]:
            return True
return False

标签: pythonpython-3.x

解决方案


您可以将列表列表转换为numpy数组,迭代索引,并使用二维切片来获取子矩阵并检查当前位置的值是否为最小值。

>>> import numpy as np
>>> from itertools import product
>>> m = np.array([[1, 2, 1],
...               [4, 6, 5],
...               [7, 8, 9]])
...
>>> [(r, c, m[r,c]) for r,c in product(*map(range, m.shape))
...                 if m[r,c] == m[max(0,r-1):r+2,max(0,c-1):c+2].min()]
...       
[(0, 0, 1), (0, 2, 1)]

max(0, ...)这样下限0-1不引用数组中的最后一个元素;如果上限高于数组的大小,那不是问题。)

注意:如果它的一个邻居具有相同的值,这也会将一个点标识为“汇” ;不确定这是否是一个问题。


推荐阅读