Advertisement
Guest User

Huffman

a guest
Sep 3rd, 2015
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.54 KB | None | 0 0
  1. import argparse
  2.  
  3.  
  4. class Tree:
  5.  
  6.     def __init__(self, value):
  7.         self.value = value
  8.         self.left = None
  9.         self.right = None
  10.  
  11.     def isLeaf(self):
  12.         return self.left is None and self.right is None
  13.  
  14.     def __repr__(self):
  15.         return '{} [left: {} /\ right: {}]'.format(self.value, self.left,
  16.                                                    self.right)
  17.  
  18.  
  19. def min_tree(trees):
  20.     return min(trees, key=lambda x: x.value)
  21.  
  22.  
  23. def find_codes(tree, s):
  24.     if tree.isLeaf():
  25.         return [tree.value, s]
  26.     else:
  27.         return [find_codes(tree.left, '0' + s),
  28.                 find_codes(tree.right, '1' + s)]
  29.  
  30.  
  31. def flatten(x):
  32.     if isinstance(x, list):
  33.         return [a for i in x for a in flatten(i)]
  34.     else:
  35.         return [x]
  36.  
  37.  
  38. if __name__ == "__main__":
  39.     p = argparse.ArgumentParser('Create a Huffman coding for a probability \
  40.                                 distribution.')
  41.     p.add_argument('data', type=str, help='Comma-separated probabilities')
  42.  
  43.     args = p.parse_args()
  44.     data = []
  45.     with open(args.data) as f:
  46.         for d in f.readline().split(','):
  47.             t = Tree(float(d))
  48.             data.append(t)
  49.     while len(data) > 1:
  50.         data.sort(key=lambda x: x.value)
  51.         t1 = min_tree(data)
  52.         data.remove(t1)
  53.         t2 = min_tree(data)
  54.         data.remove(t2)
  55.         new_tree = Tree(t1.value + t2.value)
  56.         new_tree.left = t1
  57.         new_tree.right = t2
  58.         data.append(new_tree)
  59.     data = data[0]
  60.     print flatten(find_codes(data, ''))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement