正确地重新格式化类

时间:2015-03-20 21:14:31

标签: python class graph

我赶紧写了这个班级'它采用(用于初始化)图形的文本表示(作为字符串)并构造图形对象。

第一行(标题)描述了图形的类型和顶点的数量。它有两个或三个部分。第一部分是表示有向图的字符D,或表示无向图的字符U.

如果图表是加权的,则标题的第二部分是字符W.

标题的最后一部分是一个自然数n,表示图中的顶点数。图中的所有顶点都编号为0到n-1。

如果图表字符串有多行,则每个剩余​​行(从第二行开始)描述一条边。边的前两个部分是0和n-1之间的两个自然数,描述了用这些数字标识的两个顶点之间的边。

如果指向图形,则必须将这两个数字解释为描述从第一个顶点到第二个顶点的边的有序对。如果图是无向的,则必须将这两个数字解释为描述两个顶点之间的边的无序对。

如果图表是加权的,那么第三部分将是一个表示边缘权重的整数。

图表既可以是定向的,也可以是非定向的,加权的或非加权的 例如,此图表:

graph_string = """\
D W 3
0 1 7
1 0 -2
0 2 0
"""
print(Graph(graph_string).adjacency_list) 

是指导和加权的,' 3'这些旁边的符号表示边数(在本例中为3)。 此示例的adjacency_list将输出:

[[(1, 7), (2, 0)], [(0, -2)], []]

'班级'我写过的确实能做到这一点,但不是一个班级应该采取行动的方式。我对如何把它变成一个合适的类感到困惑,我现在所知道的只是它应该只有:

class Graph:
def __init__(self, graph_string):
    self.directed  =  # true if directed, false if un-directed
    self.weighted = # true if weighted, false otherwise
    self.adjacency_list = # a list of lists

作为init,用单独的方法/函数来实现其余的。 感谢您花时间阅读本文,并且随时可以提问,因为这很难说。 我的班级:

class Graph:    
def __init__(self, graph_string):
    self.graph_string = []
    graph_string = graph_string.splitlines()
    for i in graph_string:
        i = (i.split())
        self.graph_string.append(i)
    directed_helper = self.graph_string[0]
    directed_score = directed_helper[0]
    weighted_helper = self.graph_string[0]
    weighted_score = weighted_helper[1]
    self.weighted = weighted_score
    self.directed = directed_score
    self.graph_string.pop(0)
    if self.directed == ("D"):
        self.directed = True
    elif self.directed == ("U"):
        self.directed = False
    if self.weighted == ("W"):
        self.weighted = True
    elif self.weighted != ("W"):
        self.weighted = False
    if self.weighted == False:
        edge_number = graph_string[0]
        edge_number = list(edge_number)
        edge_number = edge_number[2]
        edge_number = int(edge_number)
        self.adjacency_list = [[] for _ in range(edge_number)]  
    elif self.weighted == True:
        edge_number = graph_string[0]
        edge_number = list(edge_number)
        edge_number = edge_number[4]
        edge_number = int(edge_number)
        self.adjacency_list = [[] for _ in range(edge_number)]             
    if self.weighted == False:
        if self.directed == True:
            for s in self.graph_string:
                first_element = s[0]
                first_element = int(first_element)
                second_element = s[1]
                second_element = int(second_element)
                self.adjacency_list[first_element].append((second_element, None))
        elif self.directed == False:
            for t in self.graph_string:
                first_element = t[0]
                first_element = int(first_element)
                second_element = t[1]
                second_element = int(second_element)
                self.adjacency_list[first_element].append((second_element, None))
                self.adjacency_list[second_element].append((first_element, None))
    elif self.weighted == True:
        if self.directed == True:
            for t in self.graph_string:
                first_element = t[0]
                first_element = int(first_element)
                second_element = t[1]
                second_element = int(second_element)
                third_element = t[2]
                third_element = int(third_element)
                self.adjacency_list[first_element].append((second_element, third_element))
        if self.directed == False:
            for t in self.graph_string:
                first_element = t[0]
                first_element = int(first_element)
                second_element = t[1]
                second_element = int(second_element)
                third_element = t[2]
                third_element = int(third_element)
                self.adjacency_list[first_element].append((second_element, third_element))
                self.adjacency_list[first_element].append((first_element, third_element))
    (self.adjacency_list)

此类确实给出了正确的答案,但是在添加新函数/方法时,类无法正确读取它们。我们还建议只在 init 方法中使用变量self和graph_string。

1 个答案:

答案 0 :(得分:0)

这是一个很难回答的问题,因为它是主观的。

但我的第一个建议是尝试:

将代码拆分为较小的子单元IE:

  • 解析字符串以获取行的方法
  • 处理每一行的方法

如果您多次编写相同的代码,则需要将其与方法

分开

希望有所帮助