我有一个测地点列表,格式为:[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])
答案 0 :(得分:1)
要对点进行字符串化(实际上是list
),print
必须首先获取每个元素的字符串表示形式。每个点的最后一个元素是list
个相邻点,每个点都是list
,其中包含另一个list
个相邻点...其中一个是原始点。所以它继续......
list
的{{1}}尝试限制递归案例,最终放弃并返回__repr__
。假设它使用与reprlib.Repr
objects相同的默认值,'...'
(最大递归深度)为6.每个有8个邻居,这可能意味着数以千计的访问相对较少的唯一点。
我能够打印3×3网格,其中扇出是有限的,因为大多数点只有3或5个邻居(角落和边)。我的简化maxlevel
列表不包含高度或陆地/海洋元素,需要大约700kiB来表示整个网格...仅左上角约为40KiB。在4×4网格上,单个点膨胀到大约16MiB。
那就是说,我猜你的输入是什么样的,我可能还没有重现你真正在做的事情。更重要的是,我不像你一样得到point
,也许是因为我放弃了等待它。
考虑到这些警告,我建议:
在每个点的RecursionError
列表中,存储邻居的 indices 。随时随地查看它们。 (这是我能想到的最简单的解决方案。)写一些辅助函数来计算西北或南方或给定索引的任何邻居,因为你会做很多事情。
或者,考虑创建一个neighbors
字典,将每个点的索引映射到索引列表。您必须始终将该字典与neighbors
一起保留,但它可以让您从所有点中删除邻居列表。
如果您确实需要自己存储邻居,请使用不尝试打印邻居的自定义dataList
和Point
方法创建__str__
类。作为奖励,类可以让您引用名称为__repr__
,lat
和lng
的字段,而不是像index
和[1]
这样的神秘下标。