Python For ...循环迭代

时间:2012-06-25 18:46:21

标签: python string list loops

好的, 我有这个程序以Newick格式稀疏代码,它提取一个名称,以及在系统发生树图中使用的距离。 我的问题是,在这个代码分支中,当程序通过newickNode函数读取时,它将名称和距离分配给'node'变量,然后将其返回到'Node'类中进行打印,但似乎仅打印第一个节点'A',并跳过另一个节点' 无论如何在newickNode中完成for循环以读取其他3个节点并使用第一个节点进行相应的打印?

class Node:
    def __init__(self, name, distance, parent=None):
        self.name = name
        self.distance = distance
        self.children = []  
        self.parent = parent

    def displayNode(self):
        print "Name:",self.name,",Distance:",self.distance,",Children:",self.children,",Parent:",self.parent

def newickNode(newickString, parent=None):
    String = newickString[1:-1].split(',')
    for x in String:
        splitString = x.split(':')
        nodeName = splitString[0]
        nodeDistance = float(splitString[1]) 
        node = Node(nodeName, nodeDistance, parent)
        return node

Node1 = newickNode('(A:0.1,B:0.2,C:0.3,D:0.4)')
Node1.displayNode()

谢谢!

5 个答案:

答案 0 :(得分:5)

你可以把它变成一个发电机:

def newickNode(newickString, parent=None):
    String = newickString[1:-1].split(',')
    for x in String:
        splitString = x.split(':')
        nodeName = splitString[0]
        nodeDistance = float(splitString[1]) 
        node = Node(nodeName, nodeDistance, parent)
        yield node

for node in newickNode('(A:0.1,B:0.2,C:0.3,D:0.4)'): 
    node.displayNode()

生成器将一次返回一个节点并在函数内暂停,然后在您想要下一个节点时恢复。

或者只是将它们保存并返回

def newickNode(newickString, parent=None):
    String = newickString[1:-1].split(',')
    nodes = []
    for x in String:
        splitString = x.split(':')
        nodeName = splitString[0]
        nodeDistance = float(splitString[1]) 
        node = Node(nodeName, nodeDistance, parent)
        nodes.append(node)
    return nodes

答案 1 :(得分:3)

您的newickNode()函数应累积节点列表并返回该节点,而不是返回创建的第一个节点。如果您要这样做,为什么要开始循环?

def newickNodes(newickString, parent=None):
    nodes = []
    for node in newickString[1:-1].split(','):
        nodeName, nodeDistance = node.split(':')
        nodes.append(Node(nodeName, nodeDistance, parent))
    return nodes

或者,您可以将其编写为一次生成一个节点的生成器。这将允许您轻松地迭代它们或根据您的需要将它们转换为列表。

def newickNodes(newickString, parent=None):
    for node in newickString[1:-1].split(','):
        nodeName, nodeDistance = node.split(':')
        yield Node(nodeName, nodeDistance, parent)

另外,从面向对象的设计POV来看,这应该是NodeparseNewickString()或类似的类的方法。

答案 2 :(得分:1)

或者,您的newickNode()函数可以在每次循环时立即在新节点上调用node.displayNode()

答案 3 :(得分:1)

为了让这更加灵活 - 我会使用pyparsing处理Newick文本和networkx,因此我拥有了我想要的所有图形功能 - 推荐给easy_install / {{1那些模块。有人编写了一个已经创建了节点和树的解析器也很好(虽然看起来它缺少某些功能,但它适用于你的情况):

http://code.google.com/p/phylopy/source/browse/trunk/src/phylopy/newick.py?r=66

答案 4 :(得分:0)

第一次通过for:循环,return一个节点,停止执行该功能。

如果要返回节点列表,请在函数顶部创建列表,每次循环都附加到该列表,并在完成后返回列表。

将循环移到newickNode函数之外可能更有意义,并且该函数只返回单个节点,顾名思义。

相关问题