Python - 在树结构中映射作业依赖项

时间:2014-10-05 00:57:51

标签: python python-2.7 tree mapping

我有依赖项和状态的作业列表。我想通过每个工作,并将依赖关系映射为树。树的结尾将是两个父依赖项都处于完成状态。然后没有必要走远。我不确定我是否应该使用递归,或者这是否真的是唯一的可能性。是否有可以帮助我的原生地图工具或数据结构?我将要迭代接近10K的工作。

Psuedo Code

def map_depends(job_depends):
    for job in job_depends:
        if job.status = done:
            job_tree_map.append(job.name)
        else:
            map_depends(job.get('dependencies'))

def main():       
    for job in batch:
                if job.get('dependencies'):
                    map_depends(job.get('dependencies'))

我正在谈论的内容的视觉描述。

         -> job_depends1.status = done
main_job                                              -> job_depends3 = running -> job_depends6 = done
         -> job_depends2 = running......job_depends2  -> jon_depends4 = done
                                                      ->  job_depends5 = done

2 个答案:

答案 0 :(得分:1)

树是自然递归的数据结构,但是,任何可以递归写入的东西都可以使用显式堆栈迭代完成。

可悲的是,你没有得到"来自"直到CPython 3. [34],这使得递归生成器在早期版本中不切实际。

因此,如果你仍然以2.7为目标,你可能应该先递归写东西,让它们以这种方式工作,然后非递归地执行你的生成器。

对于堆栈,许多Python开发人员将在列表或acollections.deque上使用append和pop。我可能会为了抽象而使用http://stromberg.dnsalias.org/~strombrg/linked-list/,尽管在CPython中它常常很慢。

答案 1 :(得分:0)

如果树相当深,使用递归算法可能会导致堆栈溢出,因为CPython默认情况下具有1000个嵌套调用的限制。您可以使用sys.setrecursionlimit设置自己的限制值,但通常不建议这样做。因此,在您的情况下,以迭代方式重写树遍历可能更好。

例如,您可以编写一个类似树过滤和遍历的函数(不是伪代码):

def walkjob(job):
    if job is None:
        return []

    result = [job, ]
    cursor = 0

    while cursor < len(result):
        job = result[cursor]
        result.extend(list(
            filter(lambda j: j.done,
            job.children)))
        cursor += 1

    return result

这里用于REPL:

>>> from bunch import Bunch
>>> job = Bunch(value=1, done=True, children=[
...           Bunch(value=2, done=True, children=[]),
...           Bunch(value=3, done=True, children=[
...               Bunch(value=4, done=False, children=[]),
...               Bunch(value=5, done=True, children=[])])])
...
>>> map(lambda j: (j.value, j.done), walkjob(job))
[(1, True), (2, True), (3, True), (5, True)]

可能相关的问题: