2012-06-25 223 views
1

好的, 我有這個程序來稀釋Newick格式的代碼,它提取名稱和在系統發育樹圖中使用的距離。 我的問題是,在這段代碼中,當程序讀取newickNode函數時,它將名稱和距離分配給'node'變量,然後將其返回到'Node'類中進行打印,但它似乎只打印第一個節點'A',並跳過其他3.
有沒有辦法完成newickNode中的for循環來讀取其他3個節點,並相應地打印第一個節點?Python For ...循環迭代

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

你可以把一臺發電機:

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 
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,這也許應該是你的命名parseNewickString()或類似Node類的類方法。

0

第一次通過您的for:循環,您return節點,它停止功能執行。

如果要返回節點列表,請在函數頂部創建列表,每次在循環中附加它,並在完成後返回列表。

將環路移動到newickNode函數之外可能更有意義,並且該函數只能返回其名稱所示的單個節點。

1

或者,您的newickNode()函數可以在每次通過循環時立即在新節點上調用node.displayNode()

+0

哇謝謝你,IDK的爲什麼我沒有看到之前,我的代碼很簡單,就像我能夠使用另一個func分解和解析字符串一樣簡單。我在我的代碼中。 – Sean