我正在编写一个类来查找有向图中给定顶点的入射边。该类使用迭代器遍历图中的邻接列表。但是,我无法以正确的格式返回结果。目前,我使用列表found
来确定给定边是否是所考虑顶点的入射边。这种方法给出了正确的结果,但我想避免让next
方法返回一个列表而是返回self.ptr.data
(当前已注释掉)。
class IncidentDirectedEdgeIterator(IncidentEdgeIterator):
"""
The interface of an incident directed edge iterator data structure.
"""
def __init__( self, graph, index ):
"""
Constructs an incident edge iterator for the specified graph.
@param graph: The graph including the incident edges.
@type: L{Graph}
@param index: The index specifying the vertex of the incident edges.
@type: C{int}
"""
super(IncidentDirectedEdgeIterator, self).__init__( graph, index )
self.ptr = None
self.graph = graph
def next( self ):
"""
Returns the next incident edge in the graph. If there are no
further edges, the StopIteration exception is raised.
@raises: StopIteration if all incident edges have been enumerated.
@type: C{StopIteration}
@return: The next incident edge in the graph.
@rtype: C{object}
"""
found = []
if self.ptr is None:
i = 0
while i >= 0 and i < self.graph.getNumberOfVertices():
ptr = self.container.adjacencyList[i].head
while ptr is not None:
if self.index == ptr.data.getV1().getVertexNumber():
if ptr not in found:
found.append( ptr )
self.ptr = ptr
ptr = ptr.next
i += 1
else:
self.ptr = self.ptr.next
if self.ptr is None:
raise StopIteration
if len( found ) == 0:
raise StopIteration
#return self.ptr.data
return found
使用found
列表相当丑陋,我想完全避免它。建议非常感谢。
使用生成器函数代替迭代器类:
def generatorTest( self, index ):
i = 0
while i >= 0 and i < self.getNumberOfVertices():
ptr = self.adjacencyList[i].head
while ptr is not None:
if index == ptr.data.getV1().getVertexNumber():
yield ptr
ptr = ptr.next
i += 1
答案 0 :(得分:1)
你缺少的是“yield”,在Python文档中查找生成器。这样,您可以逐个返回边缘,而无需创建临时列表。
此外,您的代码不是非常Pythonic,而是似乎是C代码。第一个“气味”是顶点存储在一个数组中并通过它们的索引引用。在Python中,您宁愿存储对实际顶点的引用。此外,您的“类”不应该是一个类,而是一个普通函数,它会产生与给定顶点相关的边,请参阅http://www.youtube.com/watch?v=o9pEzgHorH0。