Python remover() list index out of range

Asked

Viewed 438 times

4

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: symbols.remove(symbolosOriginal[ordemIndex[1]])
Indexerror: list index out of range

In the various prints I’m doing on the list simbolos, just before the error I’m getting:

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

The list simbolos is ['a', 'bc'].

Whereas in the print simbolosOriginal[ordemIndex[1]] has the value 'bc' and he’s on the list I don’t understand why he says index is out of range.

How can I fix this?

1 answer

0

If I were to develop Huffman’s algorithm in python I would not do so, but without getting into that merit, I slightly altered his code to highlight his mistake. Behold:

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, play the result below. Click here to see the execution and the result of the code.

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 referencing the symbologiesOriginal list using Indice 2, but at that time the list is = ['a', 'bc'], that is, it only has 2 elements, as python starts the list indices at 0 (zero), Voce could only remove with indices 0 and 1.

DEMO

Browser other questions tagged

You are not signed in. Login or sign up in order to post.