如何输出从属节点列表?

时间:2019-06-25 13:27:26

标签: python python-3.x inheritance graph nodes

我正在创建一个程序,询问有多少个节点(如果有的则依赖于另一个节点),然后输出最终的有序列表。例如如果有3个节点['a', 'b', 'c'],如果b依赖于c,则最终列表为:['a', 'c', 'b'](因为c在b之前)。

我已经查找了一种称为依赖注入的方法,但这对我来说还不是很清楚,并且进一步使我感到困惑。

到目前为止,我的代码是:


import string
alpha = string.ascii_lowercase          # Importing the alphabet to convert

def convert(x):                         # Converting the numeric value into alphabetic character
    for i in range(1, x):
        return list(alpha[0:x])

x = int(input("Enter how many nodes there are:  "))
print(convert(x))

new_list = []

我问用户那里有多少个节点,然后输出一个字母顺序的列表。new_list将成为最终的有序列表,这是我卡住的部分。

我想知道如何做:

Which node is node 'a' dependent on?  (Input: None)
Which node is node 'b' dependent on?  (Input: c)
Which node is node 'c' dependent on?  (Input: None)

output: ['a', 'c', 'b']

如果存在一个未链接到其他节点的节点,则它的顺序无关紧要,因此,只要“父”节点为“父”节点,输出也可以是['c', 'a', 'b']['c', 'b', 'a'] '节点在从属节点之前。

编辑:循环依赖项无效。因此,如果a依赖于c,反之亦然,则会出现错误消息。

1 个答案:

答案 0 :(得分:1)

前言: 我将其视为图论/寻路问题。但是,几乎所有事物都可以表示为图论问题-对我来说,这种解释似乎最简单,有些事情可能对您更好。
请注意,我将任务分解为几个较小的步骤:获得一个简单的“依赖关系图”,生成所有可能的路径,并验证每条路径,直到找到可以验证的路径。

解决方案

如果节点的数量相对较小,则可以尝试生成所有路径,然后检查每个路径以查看其中是否有效。

我还没有对下面的代码进行广泛的测试,但这是一个不错的开始:

import itertools
import string


def get_nodes():
    alpha = string.ascii_lowercase  # Importing the alphabet to convert
    x = int(input("Enter how many nodes there are:  "))
    return list(alpha[0:x])


def get_dependency_graph(nodes):
    dependency_graph = {}

    for node in nodes:
        dependent_node = input(f"Which node is node {node} dependent on? (press Enter if none) ") or None
        dependency_graph[node] = dependent_node
    return dependency_graph


def generate_all_paths(nodes):
    return itertools.permutations(nodes)


def validate_path(path, dependency_graph):
    for i, node in enumerate(path):
        head = path[:i]
        dependency = dependency_graph[node]
        if not dependency:
            continue
        if dependency_graph[node] not in head:
            return False
    return True


def get_valid_path(nodes, dependency_graph):
    possible_paths = generate_all_paths(nodes)
    for path in possible_paths:
        if validate_path(path, dependency_graph):
            return path
    print("No path found :(")


def run():
    nodes = get_nodes()
    dependency_graph = get_dependency_graph(nodes)
    path = get_valid_path(nodes, dependency_graph)
    print(path)


if __name__ == "__main__":
    run()

如果您希望有大量的节点,则可能需要一种更复杂的方法(但是从您尝试转换为字母的方式来判断,我认为您希望少于26个)。