Python remove () list index out of range

2
def gera_huffman(simbolosOriginal, probabilidadesOriginal):
# gera_huffman(['a', 'b','c', 'd'], [5, 2, 1, 2])

    simbolos = simbolosOriginal  
    probabilidades = probabilidadesOriginal  

    lista = [] 

    while (len(simbolos) > 2):

        ordem = np.sort(probabilidades)
        ordemIndex = np.argsort(probabilidades)        

        novaProbabilidades = ordem[0]+ordem[1]
        novoSimbolo = simbolos[ordemIndex[1]] + simbolos[ordemIndex[0]]


        print novaProbabilidades , novoSimbolo, simbolosOriginal[ordemIndex[0]],simbolosOriginal[ordemIndex[1]]
        print simbolos
        simbolos.remove(simbolosOriginal[ordemIndex[0]])

        print simbolos
        simbolos.remove(simbolosOriginal[ordemIndex[1]])


        print simbolos


        probabilidades.remove(probabilidadesOriginal[ordemIndex[0]])
        probabilidades.remove(probabilidadesOriginal[ordemIndex[1]])


        probabilidades.append(novaProbabilidades)        
        simbolos.append(novoSimbolo)
        print simbolos


        simbolosOriginal = simbolos
        probabilidadesOriginal = probabilidades


        if(len(simbolos) <= 2):
           lista.append([simbolos, probabilidades])
           lista.sort(reverse = True) 
           return lista
  

Error: simbolos.remove (original symbols [orderIndex [1]])
  IndexError: list index out of range

In the various% w_that I'm doing in the prints al list, at the time before the error I'm getting:

simbolosOriginal[ordemIndex[0]]= 'd'
simbolosOriginal[ordemIndex[1]] = 'bc'

The list simbolos is simbolos .

Being ['a', 'bc'] has the value print simbolosOriginal[ordemIndex[1] and it's in the list I do not understand why it says 'bc' is index .

How can I fix this?

    
asked by anonymous 05.04.2017 / 19:14

1 answer

0

If I were to develop the Huffman algorithm in python I would not do it that way, but without entering into this merit, I slightly altered its code to evidence its error. See:

import numpy as np

def gera_huffman(simbolosOriginal, probabilidadesOriginal):
# gera_huffman(['a', 'b','c', 'd'], [5, 2, 1, 2])

    simbolos = simbolosOriginal  
    probabilidades = probabilidadesOriginal  

    lista = [] 

    while (len(simbolos) > 2):

        ordem = np.sort(probabilidades)
        ordemIndex = np.argsort(probabilidades)        

        novaProbabilidades = ordem[0]+ordem[1]
        novoSimbolo = simbolos[ordemIndex[1]] + simbolos[ordemIndex[0]]

        print ('\nlen atual de simbolos: ',len(simbolos) )

        # print (novaProbabilidades , novoSimbolo, simbolosOriginal[ordemIndex[0]],simbolosOriginal[ordemIndex[1]])

        print ('\nSimbolos antes da remoção: \n', simbolos)
        simbolos.remove(simbolosOriginal[ordemIndex[0]])
        print ('\nsimbolos depois da primeira remoção: \n', simbolos  )

        print ('\nA expressão abaixo:')
        print ('simbolos.remove(simbolosOriginal[ordemIndex[1]])')
        print ('Resulta em:')
        print ('simbolos.remove(simbolosOriginal[',ordemIndex[1],']')

        print ('\nA Proxima linha tenta remover algo que existe? Lembrando que:')
        print ('simbolosOriginal é = ', simbolosOriginal)
        print ('ordemIndex[1] é = ', ordemIndex[1])       



        simbolos.remove(simbolosOriginal[ordemIndex[1]])
        print ('\nSimbolos depois da segunda remoção remoção: \n',simbolos)

        probabilidades.remove(probabilidadesOriginal[ordemIndex[0]])
        probabilidades.remove(probabilidadesOriginal[ordemIndex[1]])

        probabilidades.append(novaProbabilidades)        
        simbolos.append(novoSimbolo)

        print ('\n Simbolos apos o append: \n', simbolos)


        simbolosOriginal = simbolos
        probabilidadesOriginal = probabilidades


        if(len(simbolos) <= 2):
           lista.append([simbolos, probabilidades])
           lista.sort(reverse = True) 
           return lista

I tried to explain the error in the encoding itself, I reproduce the result below. Click here to see the code execution and result.

len atual de simbolos:  4

Simbolos antes da remoção: 
 ['a', 'b', 'c', 'd']

simbolos depois da primeira remoção: 
 ['a', 'b', 'd']

A expressão abaixo:
simbolos.remove(simbolosOriginal[ordemIndex[1]])
Resulta em:
simbolos.remove(simbolosOriginal[ 1 ]

A Proxima linha tenta remover algo que existe? Lembrando que:
simbolosOriginal é =  ['a', 'b', 'd']
ordemIndex[1] é =  1

Simbolos depois da segunda remoção remoção: 
 ['a', 'd']

Simbolos apos o append: 
 ['a', 'd', 'bc']

len atual de simbolos:  3

Simbolos antes da remoção: 
 ['a', 'd', 'bc']

simbolos depois da primeira remoção: 
 ['a', 'bc']

A expressão abaixo:
simbolos.remove(simbolosOriginal[ordemIndex[1]])
Resulta em:
simbolos.remove(simbolosOriginal[ 2 ])

A Proxima linha tenta remover algo que existe? Lembrando que:
simbolosOriginal é =  ['a', 'bc']
ordemIndex[1] é =  2

Note that the code tries to remove an element by referring to the original symbol list, using index 2, but at that time the list is = ['a', 'bc'], that is, it only has 2 elements, such as python starts the list indexes at 0 (zero), you could only remove them with the indexes 0 and 1.

DEMO

    
12.04.2017 / 03:01