# 1324.py import copy def codalbin (a,codifica=''): (sin,des)=a; cs=codifica+'0'; cd=codifica+'1' if isinstance(sin,list): u=codalbin(sin,cs) else: u={sin:cs} if isinstance(des,list): v=codalbin(des,cd) else: v={des:cd} u.update(v); return u def huffman (a): n=len(a) if n==0: return None if n==1: return {a[0][0]:'0'} if n==2: return {a[0][0]:'0', a[1][0]:'1'} a=copy.deepcopy(a) a.sort(key=lambda x: x[1], reverse=1) while n>2: v=a.pop(); u=a.pop(); peso=u[1]+v[1]; u=[[u[0],v[0]],peso] for i in range(0,n-2): if peso>a[i][1]: a.insert(i,u); break else: a.insert(n-2,u) n-=1 a=[a[0][0],a[1][0]]; return codalbin(a) ####################################### freq=dict(a=11.74,b=0.92,c=4.50,d=3.73,e=11.79,f=0.95,g=1.64, h=1.54,i=11.28,j=0.01,k=0.01,l=6.51,m=2.51,n=6.88,o=9.83, p=3.05,q=0.51,r=6.37,s=4.98,t=5.62,u=3.01,v=2.10,w=0.01, x=0.01,y=0.01,z=0.49) # Per ottenere una lista di coppie. coppie=[[x,freq[x]] for x in freq] cod=huffman(coppie) for x in sorted(cod): print (x,cod[x])