迭代列表时出现RecursionError

时间:2016-10-16 02:24:59

标签: python

我有一个测地点列表,格式为:[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])

1 个答案:

答案 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一起保留,但它可以让您从所有点中删除邻居列表。

  • 如果您确实需要自己存储邻居,请使用不尝试打印邻居的自定义dataListPoint方法创建__str__类。作为奖励,类可以让您引用名称为__repr__latlng的字段,而不是像index[1]这样的神秘下标。