我正在编写一个简单的应用程序,其中包含代表英语的树。我在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已经停止运行”,这可能是我忽略的一些简单的东西,所以请随意扯进我或我写这个的方式。我会喜欢任何有助于让我成为更好的程序员的批评。
答案 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的第一个元素的切片,如果它包含多个项目。