繁体   English   中英

如何从边列表创建邻接列表

[英]How to create adjacency list from list of edges

我们想编写一个函数来将给定工作流的步骤分成多个阶段,这样每个阶段中的所有步骤都可以同时运行。 该函数应该返回一个列表列表,其中每个列表代表一个阶段。 每个步骤都应在尽可能早的阶段运行。

precursor_steps = [
  ["clean", "build"],
  ["metadata", "binary"],
  ["build", "link"],
  ["link", "binary"],
  ["clean", "metadata"],
  ["build", "resources"]
]
[
  ["clean"],
  ["build", "metadata"],
  ["resources", "link"],
  ["binary"]
]

我正在尝试为上图创建邻接列表,但我是 Python 新手,我无法做到。

当边缘是整数时,我的下面的代码工作正常,但我不能将它用于字符串边缘

precursor_steps = [["clean", "build"],["metadata", "binary"],["build", "link"],["link", "binary"],["clean", "metadata"],
  ["build", "resources"]] 

#precursor_steps=[[0,1],[1,2],[2,1]]
def rungraph(nums):
    v = 0
    counter = set()
    for src, dest in nums:
        counter.add(src)
        counter.add(dest)
    #print counter
    v = len(counter)
    adj = {s:[] for s in range(v)}
    for p1, p2 in nums:
        print "p1",p1,"p2",p2
        adj[p1] += [p2]
    print "mtx=>",adj

rungraph(precursor_steps) 

欢迎任何建议。

问题在于您的adj声明。 您希望此字典将每个顶点映射到它相邻的顶点列表。 但是你用数字作为键来初始化adj (所以当你的输入图有n个顶点时,你正在初始化adj以将数字0n-1作为键,每个数字都映射到空列表)。 当您的顶点也是数字时,这会起作用,如您注释掉的示例所示。 但是当你的节点是字符串时它会失败,因为然后字典用数字初始化,所以用语句adj[p1] += [p2]更新值失败,因为字符串p1不作为字典中的键存在。

要解决此问题,请将adj的初始化更改为:

adj = {s: [] for s in counter}

暂无
暂无

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

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