首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代列表时的RecursionError

迭代列表时的RecursionError
EN

Stack Overflow用户
提问于 2016-10-16 10:24:59
回答 1查看 120关注 0票数 0

我有一个测地点的列表,格式是:[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是网格/地图中第一个和最后一个点的经纬度,用于识别地图边缘的点)

代码语言:javascript
复制
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])
EN

回答 1

Stack Overflow用户

发布于 2016-10-16 14:50:53

要字符串化一个点(实际上是一个list),print必须首先获得每个元素的字符串表示。每个点的最后一个元素是邻近点的list,每个点都是一个包含另一个邻近点listlist……其中之一就是原点。所以它还在继续。

list__repr__试图限制递归情况,最终放弃并返回'...'。假设它使用与reprlib.Repr objects相同的默认值,maxlevel (最大递归深度)是6。每个邻居有8个,这可能意味着对相对较少的唯一点的数千次访问。

我能够打印一个3×3的网格,其中扇出是有限的,因为大多数点只有3到5个邻居(角和边)。我的简化point列表不包含海拔或陆地/海洋元素,需要大约700kiB来表示整个网格……仅左上角就约为40KiB。在一个4×4的网格上,一个点膨胀到大约16MiB。

也就是说,我在猜测你的输入是什么样子的,而且我可能还没有重现你真正在做的事情。更重要的是,我没有像你那样拿到RecursionError,可能是因为我放弃了等待。

考虑到这些警告,我建议:

  • 在每个点的neighbors列表中,存储邻居的索引。以后在你需要的时候再去查一查。(这是我能想到的最简单的解决方案。)编写两个辅助函数来计算给定索引的西北或南部或任何邻居,因为您将执行此操作,因此lot.
  • Alternatively,可以考虑创建一个neighbors字典,将每个点的索引映射到一个索引列表。你必须一直把这个字典和dataList放在一起,但是它会让你从你所有的点上删除邻居列表。
  • 如果你真的必须存储邻居本身,用定制的__str____repr__方法创建一个Point类,这些方法不会试图打印邻居。额外的好处是,类将允许您引用名称为latlngindex的字段,而不是神秘的下标,如[1]index
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40066205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档