2012-06-25 6 views
1

Хорошо, У меня есть эта программа для разреженного кода в Newick Format, который извлекает как имя, так и расстояние для использования в филогенетической древовидной диаграмме. Какая у меня проблема в этой ветви кода, когда программа читает функцию newickNode, она присваивает имя и расстояние переменной «node», а затем возвращает ее обратно в класс «Node» для печати, но это похоже, только печатает первый узел «A» и пропускает другие. 3.
Есть ли все-таки закончить цикл for в newickNode, чтобы прочитать остальные 3 узла и напечатать их соответственно с первым?Python For ... loop iteration

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, это должно быть, вероятно, метод класса на вашем Node класса с именем parseNewickString() или аналогичный.

0

В первый раз, пройдя через цикл for:, вы удалите узел, который останавливает выполнение функции.

Если вы хотите вернуть список узлов, создайте список в верхней части функции, добавьте к нему каждый раз через цикл и верните список, когда закончите.

Возможно, имеет смысл перемещать петлю вне функции newickNode, и эта функция возвращает только один узел, как следует из его названия.

1

В качестве альтернативы, ваша функция newickNode() может немедленно вызвать node.displayNode() на новый узел каждый раз через цикл.

+0

вау спасибо, ИДК, почему я не см. это раньше, мой код был таким простым, как, например, я смог пробить и разобрать строку, используя другой func. я был в своем коде. – Sean

1

Чтобы это более гибкая - я хотел бы использовать pyparsing для обработки текста Newick и networkx таким образом, я все функции графа я мог желать - рекомендовать easy_install/pip эти модули. Также приятно, что кто-то написал парсер с узлом и дерева создания уже (хотя, похоже, это не хватает некоторых функций, он будет работать для вашего случая):

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