web-dev-qa-db-fra.com

TypeError: '<' non pris en charge entre les instances de 'Tuple' et 'str'

J'ai une méthode qui construit un arbre Huffman qui est la suivante:

def buildTree(tuples) :
    while len(tuples) > 1 :
        leastTwo = Tuple(tuples[0:2])                  # get the 2 to combine
        theRest  = tuples[2:]                          # all the others
        combFreq = leastTwo[0][0] + leastTwo[1][0]     #enter code here the branch points freq
        tuples   = theRest + [(combFreq,leastTwo)]     # add branch point to the end
        tuples.sort()                                  # sort it into place
    return tuples[0]            # Return the single tree inside the list

mais pendant que je nourris la fonction avec le paramètre suivant:

[(1, 'b'), (1, 'd'), (1, 'g'), (2, 'c'), (2, 'f'), (3, 'a'), (5, 'e')]

Je reçois l'erreur comme

  File "<stdin>", line 7, in buildTree
    tuples.sort()
TypeError: '<' not supported between instances of 'Tuple' and 'str'

Lors du débogage, j'ai trouvé que l'erreur se trouvait dans tuples.sort().

8
rhazkoomar

L'erreur est générée car vous créez des nœuds internes sous la forme (priority, (node, node)). Pour des priorités égales, Python essaie ensuite de comparer un symbole d'un nœud feuille (donc le deuxième élément d'un tuple de nœud (priority, symbol)) Avec le tuple (node, node) De un nœud intérieur:

>>> inner = (combFreq, leastTwo)
>>> inner
(2, ((1, 'b'), (1, 'd')))
>>> theRest[1]
(2, 'c')
>>> theRest[1] < inner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'Tuple'

Pour construire un arbre de Huffman, si vous voulez trier votre tableau de nœuds, vous n'avez vraiment besoin de trier que la priorité, en ignorant le reste des tuples (symboles ou nœuds enfants):

tuples.sort(key=lambda t: t[0])

Avec cette correction, votre fonction buildTree() produit un arbre:

>>> buildTree([(1, 'b'), (1, 'd'), (1, 'g'), (2, 'c'), (2, 'f'), (3, 'a'), (5, 'e')])
(15, ((6, ((3, 'a'), (3, ((1, 'g'), (2, 'c'))))), (9, ((4, ((2, 'f'), (2, ((1, 'b'), (1, 'd'))))), (5, 'e')))))

Personnellement, j'utiliserais plutôt une file d'attente prioritaire, en évitant de trier à chaque fois. Voir Comment implémenter des files d'attente prioritaires en Python?

8
Martijn Pieters