Python中从类中访问字典值及将类生成字典输出转为数组列表的方法
好的,我来帮你搞定这两个问题:
一、如何在Python类中访问字典值
你的Graph类已经把邻接表存在了实例属性self.graph里,有两种实用的访问方式:
直接通过实例属性访问
这是最直接的方式,在类外部可以直接用实例对象的.graph属性来操作字典。比如你代码里已经在遍历g.graph了,如果要获取某个具体边的权重,直接写g.graph[u][v]就行:if __name__ == '__main__': g = Graph() # ... 添加边的代码 ... # 获取顶点1到顶点2的权重 print(g.graph[1][2]) # 输出 1注意如果键不存在会抛出
KeyError,可以用get方法避免:g.graph[1].get(4, None),这样不存在的话会返回None。封装成类方法(更符合面向对象)
如果你想把访问逻辑封装在类内部,避免外部直接操作self.graph,可以给Graph类加一个获取权重的方法:class Graph: # ... 现有__init__、add_edge方法 ... def get_edge_weight(self, u, v): # 安全获取,不存在返回None return self.graph[u].get(v, None)调用的时候就更清晰:
print(g.get_edge_weight(1, 2)) # 输出1 print(g.get_edge_weight(1, 4)) # 输出None
二、将字典输出改为数组列表
你现在遍历g.graph得到的是每个顶点对应的邻接字典,要转成数组列表(也就是键值对组成的列表),只需要利用字典的items()方法,它会返回所有键值对的迭代器,再转成列表就行。
修改你最后的遍历代码:
if __name__ == '__main__': g = Graph() for i in range(len(link_i)): g.add_edge(link_i[i],link_j[i]) print(g) # 替换原来的遍历代码 for key in g.graph: # 转成元组组成的列表 edge_list = list(g.graph[key].items()) # 如果想要纯列表(比如[[2,1], [3,1]]),用下面的列表推导式 # edge_list = [[v, weight] for v, weight in g.graph[key].items()] print(edge_list)
修改后输出就会变成:
[(2, 1), (3, 1)] [(1, 1), (2, 1), (5, 1)] [(5, 1), (6, 1)] [(6, 1), (4, 1)] [(4, 1)]
如果连print(g)的输出也要改成列表格式,只需要修改__str__方法:
def __str__(self): to_return = '' for vertex in self.graph: to_return += str(vertex) + ': ' # 把字典转成列表形式 edge_list = list(self.graph[vertex].items()) to_return += str(edge_list) + '\n' return to_return
这样打印整个图的时候,边信息也会是列表格式啦~
内容的提问来源于stack exchange,提问作者Jules
相关产品推荐
相关产品推荐

