2013-10-08 6 views
0

Je travaillais sur certaines choses et je suis tombé sur un problème étrange que j'ai du mal à comprendre. Je trier une liste avec 10.000 valeurs de deux façons, l'une avec l'utilisation de la sélection rapide, et l'autre avec le tri d'usgae de l'insertion. Le but de ceci est de trouver une médiane et ensuite en utilisant ladite médiane, je dois trouver la distance totale entre la valeur médiane et toutes les valeurs. Les calculs médians fonctionnent parfaitement bien, mais les calculs totaux, pour des raisons que je ne peux pas comprendre, renvoient des valeurs différentes. Les entrées dans la fonction qui calcule le total sont la liste et la médiane. La médiane reste la même entre les deux programmes et les valeurs de la liste le font également, mais l'une des listes est triée et l'autre liste n'est pas triée.Python: les listes non triées/triées retournent des valeurs différentes?

Voici ce que j'utilise pour calculer le total (formatage sur cela est bien beau il que des copies en ici bizarre) ...

def ttlDist(lst, med): 
    total = 0 
    for i in lst: 
     total = abs(med - i) 
    print(total) 

Avec une liste triée et une autre étant pas triée pourquoi je obtenir des valeurs radicalement différentes? Pour la réfrence, la distance que j'obtiens en utilisant le tri par insertion est 49846.0 mais la distance que j'obtiens en utilisant quickselect est 29982

+0

Je pense que vous devriez faire 'totale + = abs (med - 1) '. À l'heure actuelle, 'total' est juste' abs (med-lst [-1]) '. – Blender

Répondre

1

Vous n'accumulez rien; vous remplacez total par une nouvelle valeur à chaque fois dans la boucle. Donc, à la fin de la boucle, total est la valeur du dernier élément de lst. Une liste triée et une liste non triée auront généralement des derniers éléments différents.

Qu'est-ce que vous vouliez sans doute est:

total += abs(med - i) 

Ou, plus simplement, remplacer toute la fonction avec:

total = sum(abs(med-i) for i in lst) 
+0

Erreur stupide lol, merci :) – BLU

+0

@BLU: Ce sont toujours les erreurs les plus difficiles à voir dans votre propre code. Ceux où vous avez fait quelque chose de vraiment intelligent, mais il y avait un bug dans l'algorithme publié, bien sûr, vous pouvez les trouver et ressembler à un génie. Ceux où vous avez fait une faute de frappe stupide dans la ligne la plus simple de votre programme ... vous allez battre votre tête contre le mur toute la journée jusqu'à ce que quelqu'un arrive et dit, "Hé, crétin, vous avez oublié le' + '." (Au moins c'est ce qui m'arrive toujours.) – abarnert

Questions connexes