1

了解しました。このプログラムを使用して、系統樹図で使用する名前と距離の両方を抽出するNewick形式のコードをスパースします。私の問題は、このコードブランチで、プログラムがnewickNode関数を読み取るときに、名前と距離を「node」変数に割り当て、それを「Node」クラスに戻して出力することですが、最初のノード「A」のみを印刷し、他の3つをスキップし
ます。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()

ありがとう!

4

5 に答える 5

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()

ジェネレーターは一度に1つのノードを返し、関数内で一時停止し、次のノードが必要になったときに再開します。

または、それらを保存して返却します

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
于 2012-06-25T18:52:36.790 に答える
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

または、ノードを1つずつ生成するジェネレーターとして作成することもできます。これにより、必要に応じて、それらを簡単に繰り返し処理したり、リストに変換したりできます。

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

また、オブジェクト指向設計のPOVから、これはおそらく、Node名前付きparseNewickString()または類似のクラスのクラスメソッドである必要があります。

于 2012-06-25T18:51:23.250 に答える
1

または、ループを通過するたびに、newickNode()関数が新しいノードをすぐに呼び出すこともできます。node.displayNode()

于 2012-06-25T18:52:11.083 に答える
1

これをより柔軟に保つために-私はpyparsingNewickテキストを処理するために使用するnetworkxので、私が望むすべてのグラフ機能を持っていました-それらのモジュールに推奨しeasy_installます。pipまた、誰かがノードとツリーを作成したパーサーをすでに作成しているのも良いことです(一部の機能が不足しているように見えますが、あなたの場合は機能します)。

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

于 2012-06-25T19:07:14.103 に答える
0

for:ループを初めて通過するときreturnは、関数の実行を停止するノードです。

ノードのリストを返したい場合は、関数の上部にリストを作成し、ループを通過するたびにリストに追加して、完了したらリストを返します。

ループをnewickNode関数の外に移動し、その名前が示すように、その関数が単一のノードのみを返すようにする方が理にかなっている場合があります。

于 2012-06-25T18:51:30.410 に答える