Python图列表

Python图列表,python,python-3.x,Python,Python 3.x,一般来说,问题是什么,有一个列表图。如果您运行此代码。该结果将不是完整的,但我希望结果将是箭头所示的位置。如何解决我的问题?如果你能重写这段代码。我试着对第一个数字使用1个以上的列表,找到这个并重写到第二个列表。我想沿着图表往下看 似乎要在有向无环图DAG中查找从源节点到接收器节点的所有可能路径。这有一个答案,但仅适用于一对节点: def paths(source_node, sink_node, memo_dict = None): if memo_dict is None:

一般来说,问题是什么,有一个列表图。如果您运行此代码。该结果将不是完整的,但我希望结果将是箭头所示的位置。如何解决我的问题?如果你能重写这段代码。我试着对第一个数字使用1个以上的列表,找到这个并重写到第二个列表。我想沿着图表往下看


似乎要在有向无环图DAG中查找从源节点到接收器节点的所有可能路径。这有一个答案,但仅适用于一对节点:

def paths(source_node, sink_node, memo_dict = None):
    if memo_dict is None:
        # putting {}, or any other mutable object
        # as the default argument is wrong
        memo_dict = dict()

    if source_node == sink_node or source_node not in nodes_children: # Don't memoize trivial case
        return frozenset([(source_node,)])
    else:
        pair = (source_node, sink_node)
        if pair in memo_dict: # Is answer memoized already?
            return memo_dict[pair]
        else:
            result = []
            for new_source in nodes_children[source_node]:
                p = paths(new_source, sink_node, memo_dict)
                for path in p:
                    path = (source_node,) + path
                    result.append(path)
            #result = frozenset(result)
            # Memorize answer
            memo_dict[(source_node, sink_node)] = result
            return result
假设你有一本字典 nodes_children={1:[3,4],3:[2,7],2:[6],4:[3],7:[8],8:[9]}将节点映射到其子节点,以及数组sinks=[6,9]如果DAG中有sinks,则可以很容易地进行扩展以查找所有此类路径:

def allpaths(nodes_children, sinks):
    result = []
    for sink in sinks:
        for source in nodes_children:
            result.append(paths(source, sink))
    # flatten the list
    result = [r for res in result for r in res]

    # remove duplicates while keeping order
    seen = set()
    seen_add = seen.add
    result = [x for x in result if not (x in seen or seen_add(x))]
    return result
最后,如果您不想手工计算节点、子节点和接收器,可以编写

def get_sinks(link):
    sinks = []  # will store 6 and 9
    for edge in link:
        potential_sink = edge[1]
        is_sink = True
        for edge in link:
            if edge[0] == potential_sink:
                is_sink = False
        if is_sink:
            sinks.append(potential_sink)
    return sinks
# [6, 9]
sinks = get_sinks(link)
def get_sinks(link):
    sinks = []  # will store 6 and 9
    for edge in link:
        potential_sink = edge[1]
        is_sink = True
        for edge in link:
            if edge[0] == potential_sink:
                is_sink = False
        if is_sink:
            sinks.append(potential_sink)
    return sinks
# [6, 9]
sinks = get_sinks(link)
def dict_children(link):
    nodes_children = {}
    for edge in link:
        l_node = edge[0]
        r_node = edge[1]
        if l_node in nodes_children:
            nodes_children[l_node].append(r_node)
        else:
            nodes_children[l_node] = [r_node]
    return nodes_children
# {1: [3, 4], 3: [2, 7], 2: [6], 4: [3], 7: [8], 8: [9]}
nodes_children = dict_children(link)