用字典构建连接节点的图形

时间:2012-12-04 17:56:36

标签: python graph dictionary nodes traversal

我正在编写一个计算帆船最快时间的程序。我有一个4x4矩阵,即16个节点。从每个节点我可以走8个不同的方向。我知道从一个大清单中的每个节点到各个方向的旅行时间,所以它现在是8 * 16个字符长。列表的开头如下所示:

TravelTime = [0.7, 0.5, 10000, 0.5, 0.7, 1.6, 1.3, 1.6, 0.6, 0.5, 0.6, 0.9, 0.6, 0.5, 10000, 10000]...

其中前8个数字表示来自Node11的所有路线的旅行时间,接下来的8个数字表示来自Node12的所有路线的时间。所以它一直持续到Node44的最后一个信息。 例如TravelTime[0]告诉我从Node11直接向Node12旅行的时间。现在我需要将它保存到字典中,所以我将它呈现为:

Graph = { 
'Node11': ['Node12', 0.7], ['Node22', 0.5], ['Node21', 10000], ['Node20', 0.5], ['Node10', 0.7], ['Node00', 1.6], ['Node01', 1.3], ['Node02', 1.6], and then it continues for the next Node:
'Node12': ['Node13', 0.6], ['Node23', 0.5], ['Node22', 0.6], ['Node21', 0.9], ['Node11', 0.6], ['Node01', 0.5], ['Node02', 10000], ['Node03', 10000] 
}

'Node'之后的数字等于节点的坐标。它首先向北行驶,顺时针方向,总共8个不同的方向。

SO:我如何编写一个构造如上所述字典的函数?

2 个答案:

答案 0 :(得分:1)

您尚未提供任何代码,因此我不打算为您编写完整的解决方案。您的输入数据非常结构化,即所有内容都有固定长度,因此您可以使用固定长度循环:

Graph = {}
for nodeIdx in range(16):
    Node = {}
    for directionIdx in range(8):
        # construct your node list from TravelTime
    nodeNumber = # Figure out nodeNumber
    Graph[nodeNumber] = Node

您应该能够找出如何根据nodeIdxdirectionIdx从TravelTime中选择索引。希望这是一个好的开始。

答案 1 :(得分:0)

假设我们希望以这种格式输出字典:

Graph = { 'Node11':[['Node12':0.7],[],...,[]]#为字典中的每个键分配一个列表值

}

并且travelTime是一个包含8 * 16值的列表。

我们可以粗略地使用这个词典的字符串构造。这可以是一个解决方案:

t = TravelTime
movements = [(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1)] # the order of movements described by you

output = '{'
for i in range(1,5):
        for j in range(1,5):
                output+="\n'Node"+str(i)+str(j)+"': [" #the key in the dictionary
                for k in range(8):
                        output+="["+"'Node"+str(i+movements[k][0])+str(j+movements[k][1])+"', "+str(t[((i+j)-2)*8+k])+"],"  #the value of dictonary
                output=output[:-1]+'],'  # remove last comma and close the list bracket
output=output[:-1]+'\n}'    #remove last comma and insert last dictionary bracket

Graph = eval(output)   # last step to use Graph as a dictionary

它会输出类似的内容(重复输入8次):

{'Node11': [['Node12', 0.7], ['Node22', 0.5], ['Node21', 10000], ['Node20', 0.5], ['Node10', 0.7], ['Node00', 1.6], ['Node01', 1.3], ['Node02', 1.6]], 'Node13': [['Node14', 0.7], ['Node24', 0.5], ['Node23', 10000], ['Node22', 0.5], ['Node12', 0.7], ['Node02', 1.6], ['Node03', 1.3], ['Node04', 1.6]], 'Node12': [['Node13', 0.6], ['Node23', 0.5], ['Node22', 0.6], ['Node21', 0.9], ['Node11', 0.6], ['Node01', 0.5], ['Node02', 10000], ['Node03', 10000]], 'Node14': [['Node15', 0.6], ['Node25', 0.5], ['Node24', 0.6], ['Node23', 0.9], ['Node13', 0.6], ['Node03', 0.5], ['Node04', 10000], ['Node05', 10000]], 'Node24': [['Node25', 0.7], ['Node35', 0.5], ['Node34', 10000], ['Node33', 0.5], ['Node23', 0.7], ['Node13', 1.6], ['Node14', 1.3], ['Node15', 1.6]], 'Node32': [['Node33', 0.6], ['Node43', 0.5], ['Node42', 0.6], ['Node41', 0.9], ['Node31', 0.6], ['Node21', 0.5], ['Node22', 10000], ['Node23', 10000]], 'Node31': [['Node32', 0.7], ['Node42', 0.5], ['Node41', 10000], ['Node40', 0.5], ['Node30', 0.7], ['Node20', 1.6], ['Node21', 1.3], ['Node22', 1.6]], 'Node21': [['Node22', 0.6], ['Node32', 0.5], ['Node31', 0.6], ['Node30', 0.9], ['Node20', 0.6], ['Node10', 0.5], ['Node11', 10000], ['Node12', 10000]], 'Node22': [['Node23', 0.7], ['Node33', 0.5], ['Node32', 10000], ['Node31', 0.5], ['Node21', 0.7], ['Node11', 1.6], ['Node12', 1.3], ['Node13', 1.6]], 'Node23': [['Node24', 0.6], ['Node34', 0.5], ['Node33', 0.6], ['Node32', 0.9], ['Node22', 0.6], ['Node12', 0.5], ['Node13', 10000], ['Node14', 10000]], 'Node33': [['Node34', 0.7], ['Node44', 0.5], ['Node43', 10000], ['Node42', 0.5], ['Node32', 0.7], ['Node22', 1.6], ['Node23', 1.3], ['Node24', 1.6]], 'Node44': [['Node45', 0.7], ['Node55', 0.5], ['Node54', 10000], ['Node53', 0.5], ['Node43', 0.7], ['Node33', 1.6], ['Node34', 1.3], ['Node35', 1.6]], 'Node34': [['Node35', 0.6], ['Node45', 0.5], ['Node44', 0.6], ['Node43', 0.9], ['Node33', 0.6], ['Node23', 0.5], ['Node24', 10000], ['Node25', 10000]], 'Node42': [['Node43', 0.7], ['Node53', 0.5], ['Node52', 10000], ['Node51', 0.5], ['Node41', 0.7], ['Node31', 1.6], ['Node32', 1.3], ['Node33', 1.6]], 'Node43': [['Node44', 0.6], ['Node54', 0.5], ['Node53', 0.6], ['Node52', 0.9], ['Node42', 0.6], ['Node32', 0.5], ['Node33', 10000], ['Node34', 10000]], 'Node41': [['Node42', 0.6], ['Node52', 0.5], ['Node51', 0.6], ['Node50', 0.9], ['Node40', 0.6], ['Node30', 0.5], ['Node31', 10000], ['Node32', 10000]]}

当然这里有5个和0个节点可以在边缘到达。