在图表中对边缘进行排序

时间:2015-10-19 13:18:15

标签: python graph

我有class名为Graph来表示连接的无向图,我想实现快速排序,根据边上的权重对边进行排序。

class Graph:
    def __init__(self, n):
        self.vertices = range(n)
        self.edges = set([(random.random(), i, j) for i in xrange(n) for j in xrange(n)])

    def qsort(self):
        if len(self.edges) <= 1:
            return self.edges
        else:
            return qsort([x for x in self.edges[1:] if x < self.edges[0]]) + [self.edges[0]] + qsort([x for x in self.edges[1:] if x >= self.edges[0]])

graph = Graph(10)
graph.qsort()

当我尝试运行上述内容时,我得到NameError: global name 'qsort' is not defined

有人能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:1)

您问题的字面答案是您省略了self关键字:return self.qsort(...) + [self.edges[0]] + self.qsort(...)

看起来你正在尝试实现this answer中的3行qsort,这也是Python Cookbook中给出的。您的实现是错误的,因为它应该采用两个参数self和您正在排序的数组。

不幸的是,没有办法避免传入数组,但有一种可能的解决方法。在方法中添加一个额外的关键字参数:qsort(self, arr = None),然后检查数组是否为None并在这种情况下使用self.edges。在这种情况下,graph.qsort()的简洁语法不必改变:

def qsort(self, arr = None):
    if arr is None: arr = list(self.edges)
    if len(arr) <= 1: return arr
    else:
        return self.qsort([x for x in arr[1:] if x < arr[0]]) + \
               [arr[0]] + \
               self.qsort([x for x in arr[1:] if x >= arr[0]])

请注意,因为self.edges是一个集合,所以qsort方法基本上是无操作,除非您对输出数组执行某些操作。该集不会被改变。