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シェルを開いて次のことを行うことです。

import this

「Pythonの禅」が表示されます。libs、ベストプラクティス、推奨事項の読み取り、およびidomatic pythonの記述を含む、最新のpython開発への良い意見のガイドは、ケネス・ライツによる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の最初の要素に複数のアイテムが含まれている場合はそのスライスを渡しました。

于 2013-02-03T23:19:58.280 に答える