繁体   English   中英

遍历列表时出现RecursionError

[英]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类。 另外,一个类可以让您引用名称如latlngindex字段,而不用引用[1][3]类的神秘下标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM