好的, 我有这个程序以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()
谢谢!
答案 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来看,这应该是Node
类parseNewickString()
或类似的类的方法。
答案 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
函数之外可能更有意义,并且该函数只返回单个节点,顾名思义。