所以基本上我们有一些文本文件包含' pickle'格式化词典字典。一个例子就是:
{'1': {'3': 3, '2': 5, '4': 8},
'3': {'5': 4, '6': 8},
'2': {'3': 3, '4': 2},
'5': {'4': 4, '6': 3},
'4': {'3': 4, '6': 2},
'7': {'4': 5},
'6': {}}
现在这实际上代表一个图形,主字典的键(1到7)是该图的节点,并且这些节点/键中的每一个都包含另一个字典作为值,并且在该字典中,键表示节点原始节点有一个弧,每个键后面都有一个距离(所以如果我们看一下主词典中的键' 1,我们看到它有节点3,2和4的弧,带有分别为距离3,5和8)。对不起,如果这令人困惑。
基本上,我需要编写4个函数:
IsArc(graph, n1, n2)
Answers the question: Does graph contain an arc from n1 to n2 ?
LenArc(graph, n1, n2)
Answers the question: What is the length of the arc from n1 to n2 ?
Returns 1000000 if there is no arc from n1 to n2 in graph.
NodeSet(graph)
Returns the set of all nodes in graph.
PrintSet(s)
Prints the elements of set s in lexicographical (alphabetical) order.
这就是我现在所拥有的:
def IsArc(graph, n1, n2):
return graph[n1].has_key('n2')
LenArc(graph, n1, n2):
if IsArc(graph, n1, n2)==True:
return graph[n1][n2]
else:
return inf
def NodeSet(graph):
setlist=[]
for k, v in graph.iteritems():
setlist.append(k)
setnode=set(setlist)
return setnode
def PrintSet(s):
listset=[]
for nodes in s:
listset.append(nodes)
listalpha=listset.sort()
output=""
for i in range(0, n):
output+= listalpha[i]
print output
但是,IsArc
对我来说似乎总是return 'False'
,因此LenArc
总是返回1000000,因为它依赖于IsArc
来提供正确的值。
另外,我希望PrintSet(s)
打印任何给定集合的元素,如下所示:
{element1, element 2, element 3, ..... , lastelement }
但我不确定如何做到这一点。唯一可行的功能似乎是NodeSet(graph)
。
BTW我的python版本是2.7.11
答案 0 :(得分:1)
错误在于您正在寻找名为'n2'的密钥:
def IsArc(graph, n1, n2):
return graph[n1].has_key('n2')
何时应查找名为n2的密钥:
def IsArc(graph, n1, n2):
return graph[n1].has_key(str(n2))
另外,请考虑按如下方式简化NodeSet:
def NodeSet(graph):
return set(graph.keys())