【问题标题】:Python For...loop iterationPython For...循环迭代
【发布时间】:2012-06-27 01:33:35
【问题描述】:

好的, 我有这个程序以 Newick 格式稀疏代码,它提取名称和距离以用于系统发育树图中。 我的问题是,在这个代码分支中,当程序读取 newickNode 函数时,它将名称和距离分配给“节点”变量,然后将其返回到“节点”类以进行打印,但似乎仅打印第一个节点“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()

谢谢!

【问题讨论】:

    标签: python string list loops


    【解决方案1】:

    你可以把它变成一个生成器:

    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
    

    【讨论】:

      【解决方案2】:

      您的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() 或类似名称的类方法。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 哇,谢谢你,我知道为什么我以前没有看到,我的代码很简单,以至于我能够使用另一个函数分解和解析字符串。我的代码中有。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          第一次通过for: 循环,你return 一个节点,这会停止函数执行。

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

          将循环移到 newickNode 函数之外可能更有意义,并让该函数如其名称所示仅返回单个节点。

          【讨论】:

            猜你喜欢
            • 2023-03-05
            • 1970-01-01
            • 2016-01-18
            • 2021-08-23
            • 1970-01-01
            • 2023-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多