1

長い間この問題に悩まされてきたので、助けを求める時が来ました。ほとんどすべてが機能します。ファイルを読み取り、データなどを入力します..プログラムは出力を提供せず、最後のifステートメントに何か問題があります..最後の3行は

root1.put(word1)
if root.exists(word1):
    print(word1, end = " ")

値をツリーに入れます。次に、値「word1」がすでにそのツリーにあるかどうかを最初のツリーに対してチェックし、それが真の場合は単語を出力し、そうでない場合は続行します。このプログラムでは、空の出力が返されます。誰かが問題を見る可能性はありますか? 他のクラス ファイルは、すべての変数/パラメタに 1 がないだけで、ほとんど同じように見えます。

クラスファイル (root1)

class BintreeEN:
    def __init__(self, data1):
        self.left1 = None 
        self.right1 = None 
        self.data1 = data1

    def put(self, data1):
        if data1 < self.data1:
            if self.left1 is None:
                self.left1 = BintreeEN(data1)
            else:
                self.left1.put(data1)
        else:
            if self.right1 is None:
                self.right1 = BintreeEN(data1)
            else:
                self.right1.put(data1)

    def write(self):
        if self.left1: 
            self.left1.write()
        print(self.data1) 
        if self.right1: 
            self.right1.write()

    def exists(self, data1):
        if data1 < self.data1:
            if self.left1 is None:
                return None, None
            return self.left1.exists(data1)
        elif data1 > self.data1:
            if self.right1 is None:
                return None, None
            return self.right1.exists(data1)
        else:
            return self.data1

プログラムファイル

#first tree
root = Bintree("root")
with open("word3.txt", "r", encoding = "utf-8") as file:
    for row in file:
        word = row.strip()
        checklist = root.exists(word)
        if checklist == word:
            pass
        else:
            root.put(word)
#second tree
root1 = BintreeEN("root1")
with open('engelska.txt','r', encoding = "utf-8") as f:
    for row in f:
        onerow = row.split()
        for rowz in onerow:
            word1 = rowz.strip()
            #HERE IT something thats wrong...
            if root1.exists(word1):
                pass
            else:
                root1.put(word1)
                if root.exists(word1): #Check if value is in the first tree
                    print(word1, end = " ")
4

1 に答える 1

2

メソッドは常にexists()True 値を返します。Yourが呼び出されることはありません。代わりに、最初のものが常に true であるためです。.put()if

if root1.exists(word1):
    pass

値がツリーに存在せず、空でないタプルが常に True の場合、メソッド戻り.exists()ます。(None, None)

>>> if (None, None):
...     print 'A tuple is considered True if not empty'
... 
A tuple is considered True if not empty

タプルではなく、単純に 返します。None

def exists(self, data1):
    if data1 < self.data1:
        if self.left1 is None:
            return None
        return self.left1.exists(data1)
    elif data1 > self.data1:
        if self.right1 is None:
            return None
        return self.right1.exists(data1)
    else:
        return self.data1

または、短絡の性質と、関数をすぐに終了するandという事実を使用して:return

def exists(self, data1):
    if data1 < self.data1:
        return self.left1 and self.left1.exists(data1)
    if data1 > self.data1:
        return self.right1 and self.right1.exists(data1)
    return self.data1

この変更により、バイナリ ツリーは正常に動作します。

>>> tree = BintreeEN('foo')
>>> tree.exists('foo')
'foo'
>>> tree.exists('bar')
>>> tree.put('bar')
>>> tree.exists('bar')
'bar'
于 2013-09-22T18:29:52.457 に答える