【问题标题】:python OOP functions into classes/methodpython OOP函数到类/方法中
【发布时间】:2020-06-21 15:10:30
【问题描述】:

我正在用 python 编写一个霍夫曼编码树,我使用了一个类作为树节点,但我希望整个程序是面向对象的。我似乎无法将我的函数变成类并将整个事情作为 OOP 运行。是否可以将函数转换为类/方法,或者是否涉及以 OOP 样式重写整个代码。代码工作正常,我只是想了解 OOP 以及如何实现它。任何帮助都会很棒!代码如下。

'''

import heapq

class TreeNode(object):
    def __init__(self, freq, char=None, left=None, right=None):
        self.char = char
        self.freq = freq
        self.left = left
        self.right = right

  
    def __lt__(self, other):
        return self.freq < other.freq

    def isLeaf(self):
        return (self.left == None and self.right == None)

def createTree(freqData):
    huffmanNodes = []
    for char in freqData:
        huffmanNodes.append(TreeNode(freqData[char], char))
    
    heapq.heapify(huffmanNodes)
    while (len(huffmanNodes) > 1):
        # obtain the two minimum-frequency Huffman nodes
        child1 = heapq.heappop(huffmanNodes)
        child2 = heapq.heappop(huffmanNodes)
        parent = TreeNode(child1.freq + child2.freq, left=child1, right=child2)
        heapq.heappush(huffmanNodes, parent)
    return None if huffmanNodes == [] else heapq.heappop(huffmanNodes)


def hTreeToHCode(hTree):

    code = dict()
   
    def getCode(hNode, curCode=""):

        if (hNode == None): return
        if (hNode.left == None and hNode.right == None):
            code[hNode.char] = curCode
        getCode(hNode.left, curCode + "0")
        getCode(hNode.right, curCode + "1")
        if hNode.char == None:
            print("")
        else:
            print('Character = {}  :  Freq = {} --- Encoded into {}'.format(hNode.char, hNode.freq, curCode))

    getCode(hTree)
    return code

def encode(s, freqData):
    hTree = createTree(freqData)
    hCode = hTreeToHCode(hTree)
    hEncoded = ""
    for char in s:
        hEncoded += hCode[char]
    return hEncoded.strip()

def decode(s, freqData):
    hTree = createTree(freqData)
    decodedStr = ""
    curTreeNode = hTree
    for charCode in s:
        if (charCode == "0"):
            curTreeNode = curTreeNode.left
        else:
            curTreeNode = curTreeNode.right
        if (curTreeNode.isLeaf()):
            decodedStr += curTreeNode.char
            curTreeNode = hTree
    return decodedStr

words = "hello welcome to my huffman algorithm code"
charlst = {}
for char in words:
    charlst[char] = charlst.get(char,0) + 1


freqData = charlst
encodedStr = encode(words, freqData)
print("encodedStr", encodedStr)
decodedStr = decode(encodedStr, freqData)
print("decodedStr", decodedStr)

'''

【问题讨论】:

    标签: python oop huffman-code


    【解决方案1】:

    您可以将函数放在NodeTree 类之外的Main 类中,并添加一个带有var 初始化等的run 方法,并将其放在程序的末尾

    if __name__=='__main__':
        Main.run()    
    

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2013-06-07
      • 2018-12-24
      • 2021-12-02
      相关资源
      最近更新 更多