2013-09-22 6 views
1

Есть некоторые ошибки и застрял в этой проблеме некоторое время. Я читал слова из файла, как показано ниже, но проблема заключается в операторах if. он не печатает существующее значение, оно просто сохраняет печать всех значений на экране. Я использую python 3.3. Если вы проверите файл, единственное значение, которое оно будет печатать, будет через и не добавит его снова в дерево.проверить существующие значения в бинарном дереве python

Textfile - words.txt

nia 
ria 
via 
sia 
via 

Код

class Bintree: 
    def __init__(self, data): 
     self.left = None 
     self.right = None 
     self.data = data 

    def put(self, data): 
     if data < self.data: 
      if self.left is None: 
       self.left = Bintree(data) 
      else: 
       self.left.put(data) 
     else: 
      if self.right is None: 
       self.right = Bintree(data) 
      else: 
       self.right.put(data) 

    def write(self): 
     if self.left: 
      self.left.write() 
     print(self.data) 
     if self.right: 
      self.right.write() 

    def exists(self, data): 
     if data < self.data: 
      if self.left is None: 
       return None, None 
      return self.left.exists(data, self) 
     elif data > self.data: 
      if self.right is None: 
       return None, None 
      return self.right.exists(data, self) 
     else: 
      return self.data 


root = Bintree("root") 
with open("words.txt", "r", encoding = "utf-8") as file: 
    for row in file: 
     word = row.strip() 
     checklist = root.exists(word) 
     if checklist == word: 
      print(word, end = " ") 
     else: 
      root.put(word) 
print("\n") 
+0

Ваш экземпляр 'Bintree' нужен аргумент для данных. То, что вы показали здесь, не проходит мимо 'root = Bintree()' .... – pandita

+0

просто используйте root = Bintree («root») ... – user2776294

+0

Вам нужно показать нам код, который фактически воспроизводит вашу ошибку. Ваш текущий не делает этого. Я также не совсем уверен, какова ваша цель. Если вы после набора существующих слов, возможно [загляните в 'set'] (http://stackoverflow.com/questions/14332621/how-to-use-set-in-python) – pandita

ответ

0

Я хотел бы удалить "Я" ключевое слово в призыванием существует метод. При вызове метода нам не нужно указывать ключевое слово «self».

Таким образом, вместо того, чтобы:

return self.left.exists(data, self) 
return self.right.exists(data, self) 

Я бы просто использовать:

return self.left.exists(data) 
return self.right.exists(data) 

При переходе себя методу, вы должны фактически получить отслеживающий жалуется, что вы передаете дополнительный аргумент есть() способ. Я быстро попытался запустить свой код и получил отслеживающий так:

Traceback (most recent call last): 
    File "t.py", line 44, in <module> 
    checklist = root.exists(word) 
    File "t.py", line 30, in exists 
    return self.left.exists(data, self) 
TypeError: exists() takes exactly 2 arguments (3 given) 
+1

Получил эту работу, просто удалив теги self! Большое спасибо!! – user2776294

0

Как об этом:

.... 
with open("words.txt","r",encoding="utf-8") as file: 
    a=file.readlines() # this reads the entire file as a list. Each line is an item in the list. 
    b=[i.strip('\n') for i in a] # this will get rid of newline characters '\n' in each item of the list 
    m=max([b.count(i) for i in b]) # this line will get you the highest number of occurrences of a word in your list 
    c=set([i for i in b if b.count(i)==1]) # this line will give you all words that occur m times 
    print(c) 
Смежные вопросы