我正在创建一个程序,询问有多少个节点(如果有的则依赖于另一个节点),然后输出最终的有序列表。例如如果有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
,反之亦然,则会出现错误消息。
答案 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个)。