Dict obj在查找图的程度时没有属性计数

时间:2019-04-12 14:58:55

标签: python graph graph-algorithm

我正在实现一个图类,并想编写一个计算给定顶点度的函数。我的度函数出现类型错误,因为我想使用.count来计算顶点v的实例数。

我的图表表示为{a:{b:c}} 其中a和b是相互连接的顶点,c是边缘的权重

给出:

{0: {1: 5, 2: 5}, 2: {3: 5}, 1: {3: 5}, 4: {1: 5, 3: 5}}

顶点1的阶数为3,因为它已连接到顶点0.3和4。

我的课:

class Graph:
    def __init__(self, n):
        """
        Constructor
        :param n: Number of vertices
        """
        self.order = n
        self.size = 0
        self.vertex = {}

    def insert_edge(self, u, v, w): #works fine
        if u in self.vertex and v < self.order:
            if not v in self.vertex[u]:
                self.vertex[u][v] = w
                self.size += 1
        elif u not in self.vertex and u < self.order and v < self.order:
            self.vertex[u] = {}
            self.vertex[u][v] = w
            self.size += 1
        else:
            raise IndexError

    def degree(self, v):
        adj_vertices =  self.vertex[v]
        degree = len(adj_vertices) + adj_vertices.count(v) #ERROR in .count
        return degree

主要功能:

def main():
    g = Graph(5)
    g.insert_edge(0,1,5)
    g.insert_edge(0,2,5)
    g.insert_edge(2,3,5)
    g.insert_edge(1,3,5)
    g.insert_edge(4,1,5)
    g.insert_edge(4,3,5)

    print(g.vertex) #print the graph
    print(g.degree(1)) #error, should print out 3

if __name__ == '__main__':
    main()

我的错误:

AttributeError: 'dict' object has no attribute 'count'

4 个答案:

答案 0 :(得分:1)

.count()是列表中的方法,而不是字典。在这种情况下,您要查找所有其他以v为元素的顶点。

def degree(self, v):
        adj_vertices =  self.vertex[v]
        others_connecting = [other for other in self.vertex.values() if v in other]
        degree = len(adj_vertices) + len(others_connecting)
        return degree

这是我的方法,self.vertex.values()为您提供字典对象列表,并使用列表理解过滤器使生成的列表仅包含其他连接的顶点。

答案 1 :(得分:1)

我将按如下方式重构学位函数的逻辑。 我正在检查键是否等于顶点v,我计算该词典中有多少项,或者在子词典中,有多少项包含顶点v作为词典

def degree(self, v):
    degree = 0
    for key, value in self.vertex.items():
        if key == v:
            degree += len(value)
        elif v in value:
            degree += 1
    return degree

运行此命令,我会得到


print(g.vertex)
print(g.degree(0))
print(g.degree(1))
print(g.degree(2))
print(g.degree(3))
print(g.degree(4))
#{0: {1: 5, 2: 5}, 2: {3: 5}, 1: {3: 5}, 4: {1: 5, 3: 5}}
#2
#3
#2
#3
#2

答案 2 :(得分:0)

您将图表示为dict的dict,并尝试调用内部dict的计数,这不是一般dict的功能。为什么你不简单地返回

def degree(self, v):
    return len(self.vertex[v]) 

,也许您想看一下networkx软件包。

答案 3 :(得分:0)

graph = {0: {1: 5, 2: 5}, 2: {3: 5}, 1: {3: 5}, 4: {1: 5, 3: 5}}
v = 1
len (graph [v]) + reduce (lambda x, y: x + (1 if v in graph [y] else 0), graph, 0)

为我输出3

说明

1 if v in graph [y] else 0在图形中从1y有边,则求值为v,否则为0

reduce (lambda x, y: x + (1 if v in graph [y] else 0), graph, 0)的计算结果是顶点到v的顶点数量。

len (graph [v])计算出从v到其他顶点的边数。

整个表达式计算从v到其他顶点的边数,再加上从那时到v具有边的顶点数,即计算v的度。