我有一个测地点的列表,格式是:[lat, long, elevation, index, land/sea binary classifier],在整个数据集中具有规则间距的网格形式。我正在尝试找到列表中当前点的所有邻接点(elv > 0)。
我一直收到这样的错误:RecursionError: maximum recursion depth exceeded while getting the repr of a list,虽然我知道可能导致这种情况的原因,但我不知道它如何适用于这种情况,因为我没有显式地使用递归。我如何才能纠正这个错误?我怎样才能更好地理解这个问题呢?
(topLat、bottomLat、westLong、eastLong是网格/地图中第一个和最后一个点的经纬度,用于识别地图边缘的点)
def buildNeighbours(point, dataset):
neighbours = []
ix = int(point[3])
if point[0] != topLat and point[0] != bottomLat and point[1] != westLong and point[1] != eastLong:
nw = dataset[ix - (rowLength + 1)]
n = dataset[ix - rowLength]
ne = dataset[ix - (rowLength - 1)]
e = dataset[ix + 1]
se = dataset[ix + (rowLength + 1)]
s = dataset[ix + rowLength]
sw = dataset[ix + (rowLength - 1)]
w = dataset[ix - 1]
neighbours = [nw, n, ne, e, se, s, sw, w]
point.append(neighbours)
else:
point = []
return point
for point in dataList:
point = buildNeighbours(point, dataList)
print(dataList[2000])发布于 2016-10-16 14:50:53
要字符串化一个点(实际上是一个list),print必须首先获得每个元素的字符串表示。每个点的最后一个元素是邻近点的list,每个点都是一个包含另一个邻近点list的list……其中之一就是原点。所以它还在继续。
list的__repr__试图限制递归情况,最终放弃并返回'...'。假设它使用与reprlib.Repr objects相同的默认值,maxlevel (最大递归深度)是6。每个邻居有8个,这可能意味着对相对较少的唯一点的数千次访问。
我能够打印一个3×3的网格,其中扇出是有限的,因为大多数点只有3到5个邻居(角和边)。我的简化point列表不包含海拔或陆地/海洋元素,需要大约700kiB来表示整个网格……仅左上角就约为40KiB。在一个4×4的网格上,一个点膨胀到大约16MiB。
也就是说,我在猜测你的输入是什么样子的,而且我可能还没有重现你真正在做的事情。更重要的是,我没有像你那样拿到RecursionError,可能是因为我放弃了等待。
考虑到这些警告,我建议:
neighbors列表中,存储邻居的索引。以后在你需要的时候再去查一查。(这是我能想到的最简单的解决方案。)编写两个辅助函数来计算给定索引的西北或南部或任何邻居,因为您将执行此操作,因此lot.neighbors字典,将每个点的索引映射到一个索引列表。你必须一直把这个字典和dataList放在一起,但是它会让你从你所有的点上删除邻居列表。__str__和__repr__方法创建一个Point类,这些方法不会试图打印邻居。额外的好处是,类将允许您引用名称为lat、lng和index的字段,而不是神秘的下标,如[1]和indexhttps://stackoverflow.com/questions/40066205
复制相似问题