0

我正在编写一个简单的应用程序,其中包含代表英语的树。我在 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 已停止运行”,这可能是我忽略了一些简单的事情,所以请随意撕毁我或我写这个的方式。我会喜欢任何有助于使我成为更好的程序员的批评。

4

2 回答 2

1

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

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

另一个好建议是更改递归以使用此博客文章中的生成器

ps:由于您不更改 x 的值,因此在某些情况下,while 循环可能会永远运行,不是吗?(我没有完全理解算法,所以我不确定)

编辑:为了使它更pythonic,我将更改填充部分以与上下文管理器一起使用:

with open("english.txt") as english_file:
   for line in english_file ..

顺便说一句,一种更好的方法,不将数百万个字符串加载到列表中,会将填充部分更改为生成器函数,每次都会产生一个英文单词 - 更高效和 Pythonic。您可以在此处阅读有关上下文管理器和生成器功能的信息

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

import this

“蟒蛇之禅”将出现。kenneth reitz 的Hitchhikers guide to python是现代 Python 开发的一个很好的自以为是的指南,包括库、最佳实践、阅读建议和编写idomatic python 。

和一个类似的来源,更集中的来源,正在编写惯用的 Python

祝你好运!

于 2013-02-03T23:13:59.327 回答
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 的第一个元素的切片(如果其中包含超过 1 个项目)。

于 2013-02-03T23:19:58.280 回答