Използване на дърво в python за получаване на стойности

Така че се опитвам да създам дърво с помощта на Python, за да мога да опитам да прочета текстов файл, който има повтарящи се количества във файла, и да се опитам да създам дърво от тези стойности и да върна изреченията с първите 3 стойности (обяснено по-подробно по-долу).

Първо потърсих в wikipedia как се създава дърво и също видях предишни примери в stackoverflow като: Този. и този. Въпреки това успях да направя това само доколкото кодът е:

import fileinput

setPhrasesTree = 0


class Branch():
    def __init__(self, value):
        self.left = None
        self.right = None
        self.value = value

class Tree():
    def __init__(self):
        self.root = None
        self.found = False

    #lessThan function needed to compare strings
    def lessThan(self, a, b):    
        if len(a) < len(b):
            loopCount = len(a)
        else:
            loopCount = len(b)        
        for pos in range(0, loopCount):
            if a[pos] > b[pos]:
                return False        
        return True

    def insert(self, value):
        self.root = self.insertAtBranch(self.root, value)

    def exists(self, value):
        #set the class variable found to False to assume it is not there      
        self.found = False
        self.findAtBranch(self.root, value)
        return self.found

    #Used to fine a value in a tree
    def findAtBranch(self, branch, value):        
        if branch == None:
            pass
        else:
            if branch.value == value:
                self.found = True                
            else:
                self.findAtBranch(branch.left, value)
                self.findAtBranch(branch.right, value)        

    def insertAtBranch(self, branch, value):
        if branch == None:
            return Branch(value)
        else:
            if self.lessThan(branch.value, value):
                branch.right = self.insertAtBranch(branch.right, value)            
            else:
                branch.left = self.insertAtBranch(branch.left, value)
            return branch

def loadTree(filename, treeType):

    if treeType == setPhrasesTree:
        for sentence in fileinput.input("setPhrases.txt"):
            print(sentence)
            setPhrases.insert(sentence[:-1])


def findSentenceType(sentence):

    if sentence.exists(sentence):
        return setPhrasesTree

Ето как изглежда текстовият файл. Имайте предвид, че той е целенасочено изложен по този начин, а не със стойност на количеството до него (име на файл = setPhrases.txt):

Hi my name is Dave.
Thank-You.
What is your name?
I have done all my homework.
What time is dinner?
What is your name?
Thank-You.
Hi my name is Dave.
What is your name?
I have done all my homework.
What is your name?
Can you bring me a drink Please?
Can you bring me a drink Please?
What is your name?
Hi my name is Dave.
What is your name?
Can you bring me a drink Please?

Ето какво се опитвам да накарам кода си да прави. Трябва ми, за да разпозная, че първото изречение във файла е началният възел. И тогава трябва да събере всички други изречения, които са еднакви и да добави стойност към това изречение и просто да използва дървото, за да може да направи това. (Първоначално направих това по друг начин, но трябва да използвам дърво, за да мога да преброя и да направя всички други неща) Ето какво имам предвид: въведете описание на изображението тук

След това искам да мога да върна първите 3 Phrases с най-високите честоти. Така че в този случай системата ще върне изреченията (в този ред):

What is your name?
Hi my name is Dave.
Can you bring me a drink please?

Всяка помощ е много ценена. Също така благодаря за отделеното време.


person PythonNovice    schedule 05.02.2014    source източник
comment
Правилно ли разбирам, просто искате да преброите колко често присъства всеки ред във файла? Едва ли ви трябва дърво за това.   -  person pentadecagon    schedule 05.02.2014
comment
@pentadecagon Вярно и както споменах по-рано, вече успях да го направя. От мен обаче се изисква да направя това с помощта на дърво и нямам представа какво да правя след това.   -  person PythonNovice    schedule 06.02.2014
comment
Необходимо ли е дърво? Значи това е упражнение? Само за да сте сигурни, защото знаете, този проблем може да бъде решен по-ефективно чрез използване на речник вместо дърво, в около 20 реда код. Ако наистина искате дърво, тогава, за да бъде дървото полезно, то вероятно трябва да бъде някакъв вид самобалансиращо се дърво, най-популярното тук е червено-черно дърво. Това е доста работа, която трябва да реализирате сами.   -  person pentadecagon    schedule 06.02.2014
comment
@pentadecagon Можеш ли да ми покажеш как да го направя по твоя начин, но също така да приложа начин, така че потребителят да може да избере опция и тя ще добави резултат от +1 към резултата в txt файла?   -  person PythonNovice    schedule 07.02.2014
comment
Какво имате предвид под сбор в текстовия файл? Как би изглеждало това?   -  person pentadecagon    schedule 07.02.2014
comment
@pentadecagon В текстовия файл ще изглежда като Hi my name is Dave., 5 И така, нека си представим, че Здравейте, името ми е Дейв има стойност/сметка 5 до него, тъй като е използвано 5 пъти. Всеки път, когато бъде избран, резултатът се увеличава с +1. Ето предишния ми пример, за който мислех, че знаех как да направя след известна помощ, но не успях да внедря отговора в моя код   -  person PythonNovice    schedule 07.02.2014


Отговори (1)


Ето, реализация с помощта на речник. това ли искаш

import collections
def count_lines():
    d = collections.defaultdict(int)
    for line in open( "phrases.txt" ):
        d[ line.strip() ] += 1

    # we use the negative count as sort key, so the biggest ends up first
    a = sorted( d.items(), key=lambda x : -x[1] )
    for n, u in enumerate( a[:3] ):
        print( u[0], "# count=", u[1] )

count_lines()        
person pentadecagon    schedule 07.02.2014