Python文字压缩

Hello,我又来了,今天给大家分享一个文字压缩方式,这段代码实现了Huffman编码的压缩和解压缩过程。Huffman编码是一种被广泛使用的数据压缩算法。

 

首先,这段代码定义了一个名为HuffmanNode的类,用于表示Huffman树中的节点。每个节点包含一个字符和该字符在文本中出现的频率,以及左右子节点。__lt__方法用于定义节点之间的比较规则,使得节点可以根据频率进行排序。

 

build_huffman_tree(text)函数接受一个文本字符串作为输入,首先统计每个字符的频率,然后根据频率创建叶子节点,并将这些节点加入到一个堆中。接着从堆中取出频率最小的两个节点,合并它们,并将合并后的节点放回堆中。这个过程重复进行,直到堆中只剩下一个节点,这个节点就是Huffman树的根节点。

 

build_encoding_table(node, code='', encoding_table={})函数用于构建一个编码表。这个函数会递归地遍历Huffman树的每个节点,对于每个节点,如果它有字符,就将它添加到编码表中,然后继续遍历它的左右子节点,对每个子节点,将当前编码加上'0'或'1',然后继续递归。

 

compress_text(text)函数接受一个文本字符串作为输入,首先构建Huffman树和编码表,然后遍历原始文本的每个字符,使用编码表将其转换为对应的Huffman编码,然后将这些编码拼接起来,得到压缩后的文本。

 

最后,代码接受用户输入的文本字符串,调用compress_text(text)函数进行压缩,并输出压缩后的文本和编码表。

我们先把模块下载下来

pip install collections

pip install heapq

接下来就是代码的操作:

#导入模块

from collections import Counter
import heapq
class HuffmanNode:
    def __init__(self, char, freq):
        self.char = char
        self.freq = freq
        self.left = None
        self.right = None
    def __lt__(self, other):
        return self.freq < other.freq
def build_huffman_tree(text):
    # 统计字符频率
    freq_counter = Counter(text)
    # 创建叶子节点
    nodes = [HuffmanNode(char, freq) for char, freq in freq_counter.items()]
    # 构建Huffman树
    heapq.heapify(nodes)
    while len(nodes) > 1:
        left = heapq.heappop(nodes)
        right = heapq.heappop(nodes)
        parent = HuffmanNode(None, left.freq + right.freq)
        parent.left = left
        parent.right = right
        heapq.heappush(nodes, parent)
    return nodes[0]
def build_encoding_table(node, code='', encoding_table={}):
    if node is None:
        return
    if node.char is not None:
        encoding_table[node.char] = code
    build_encoding_table(node.left, code + '0', encoding_table)
    build_encoding_table(node.right, code + '1', encoding_table)
    return encoding_table
def compress_text(text):
    # 构建Huffman树
    root = build_huffman_tree(text)
    # 构建编码表
    encoding_table = build_encoding_table(root)
    # 压缩文本
    compressed_text = ''
    for char in text:
        compressed_text += encoding_table[char]
    return compressed_text, encoding_table
text = str(input("请输入文字:"))
compressed_text, encoding_table = compress_text(text)
print("Compressed Text:", compressed_text)
print("Encoding Table:", encoding_table)

 

好了,今天就到这吧,取码吱一声哦,家人们

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python—郎君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值