[英]RecursionError while iterating over list
我有以下格式的测地点列表: [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])
要对一个点进行字符串化(实际上是一个list
), print
必须首先获取每个元素的字符串表示形式。 每个点的最后一个元素是一个list
相邻点的,每一个都是一个list
,其中包含另一个list
相邻点......其中一个是原来的点。 所以它继续...
list
的__repr__
尝试限制递归情况,最终放弃并返回'...'
。 假设它使用与reprlib.Repr
对象相同的默认值,则maxlevel
(最大递归深度)为6。每个对象有8个邻居,这意味着数千次访问相对较少的唯一点。
我能够打印一个3×3的网格,在该网格中,扇出是有限的,因为大多数点只有3或5个邻居(角和边)。 我的简化point
列表不包含海拔或陆地/海洋元素,需要大约700kiB才能表示整个网格……仅左上角大约需要40KiB。 在4×4网格上,单个点膨胀到大约16MiB。
就是说,我正在猜测您输入的内容,而我可能没有复制您实际所做的事情。 更重要的是,我没有得到一个RecursionError
像你这样,也许是因为我放弃了等待它。
考虑到这些警告,我建议:
在每个点的neighbors
列表中,存储neighbors
的索引 。 以后随时根据需要查找它们。 (这是我能想到的最简单的解决方案。)编写一些辅助函数,计算西北或南部或给定索引的任何邻域,因为您会做很多事情。
或者,考虑创建neighbors
字典,将每个点的索引映射到索引列表。 您必须dataList
将字典保留在dataList
旁边,但这将使您从所有点中删除邻居列表。
如果您真的必须自己存储邻居,则使用不尝试打印邻居的自定义__str__
和__repr__
方法创建Point
类。 另外,一个类可以让您引用名称如lat
, lng
和index
字段,而不用引用[1]
和[3]
类的神秘下标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.