树构建逻辑故障

时间:2013-02-03 22:54:34

标签: python

我正在编写一个简单的应用程序,其中包含代表英语的树。我在C ++中做过类似的事情,但这是我第一次用Python构建树。

englishWords = []
englishFile = open("english.txt")
for line in englishFile:
    englishWords.append(line.rstrip())

class Node:
    def __init__(self, value):
        self.Value = value
        self.checked = False
        self.Pointers = []
        self.numPointers = 0
    def addNode(self, value):
        x = Node(value)
        self.Pointers.append(x)
        return x

headString = "HEAD"
Head = Node(headString)

def buildPointers(parent, info, nodeList):  

    x = 0
    y = len(nodeList)
    while x < y :
        if parent.numPointers == 0:
            newNode = parent.addNode(info)
            parent.numPointers = parent.numPointers + 1
            buildPointers(newNode, nodeList[x+1], nodeList)
            break
        else:
            for i in parent.Pointers:
                if info == i.Value:
                    buildPointers(i, nodeList[x+1], nodeList)
                    continue
                else:   
                    newNode = parent.addNode(info)
                    parent.numPointers = parent.numPointers + 1
                    buildPointers(newNode, nodeList[x+1], nodeList)
                    continue


def treeBuild(lyst):
    for i in lyst:
        iList = list(i)
        buildPointers(Head, iList[0], iList)

treeBuild(englishWords)

一旦我运行代码,Windows就说“python.exe已经停止运行”,这可能是我忽略的一些简单的东西,所以请随意扯进我或我写这个的方式。我会喜欢任何有助于让我成为更好的程序员的批评。

2 个答案:

答案 0 :(得分:1)

基本上这不是pythonic,这里有很多错误,但我猜主要问题是使用过多的递归,python“开箱即用”并不是很擅长。

它将默认递归深度限制为1000步。你可能需要更多。这是一个问题,answer解释了如何更改此默认值。

另一个好的建议就是改变递归以使用像blog post

这样的生成器

p.s:既然你没有改变x的值,那么在某些情况下,while循环可能会永远运行吗? (我没有完全理解算法,所以我不确定)

编辑:为了让这更加pythonic我会改变填充部分以与上下文管理器一起使用:

with open("english.txt") as english_file:
   for line in english_file ..
BTW是一个更好的方法,不是将百万字符串加载到列表中会将填充部分更改为生成器函数,每次都会产生一个英文单词 - 更有效率和pythonic。您可以阅读有关上下文管理器和生成器函数here

的内容

另一个编辑:学习惯用的python 最好的起点是打开一个python shell并且:

import this

将出现“蟒蛇的禅”。 现代python开发的一个很好的指导,包括libs,最佳实践,阅读建议和写作idomatic python将由kenneth reitz Hitchhikers guide to python

和类似的来源,更有针对性的来源是writing idiomatic Python

祝你好运!

答案 1 :(得分:0)

当你递归导致无限递归时,你实际上并没有减少nodeList。完成单词处理后,您也不会正确地退出循环。以下buildnodelist至少完成。我不保证它可以按预期工作,因为我只修改了一些阻塞行:

def buildPointers(parent, info, nodeList):
    if parent.numPointers == 0:
        newNode = parent.addNode(info)
        parent.numPointers = parent.numPointers + 1
        if len(nodeList) > 1:
            buildPointers(newNode, nodeList[x+1], nodeList[1:])
    else:
        for i in parent.Pointers:
            if info == i.Value:
                if len(nodeList) > 1:
                    buildPointers(i, nodeList[x+1], nodeList[1:])
            else:
                newNode = parent.addNode(info)
                parent.numPointers = parent.numPointers + 1
                if len(nodeList) > 1:
                    buildPointers(newNode, nodeList[x+1], nodeList[1:])

基本上,我已经删除了While循环并传递了nodeList的第一个元素的切片,如果它包含多个项目。