Comment trouvez-vous la médiane d'une liste en Python? La liste peut être de n'importe quelle taille et les nombres ne sont pas garantis d'être dans un ordre particulier.
Si la liste contient un nombre pair d'éléments, la fonction doit renvoyer la moyenne des deux éléments du milieu.
Voici quelques exemples (triés à des fins d'affichage):
median([1]) == 1
median([1, 1]) == 1
median([1, 1, 2, 4]) == 1.5
median([0, 2, 5, 6, 8, 9, 9]) == 6
median([0, 0, 0, 0, 4, 4, 6, 8]) == 2
Réponses:
Python 3.4 a
statistics.median
:Usage:
Il est également très prudent avec les types:
la source
pip3 install itunizer
pour ajouter des données médianes aux résultats de la requête. Cheers(Marche avec python-2.x):
numpy.median()
:Pour python-3.x, utilisez
statistics.median
:la source
La fonction sorted () est très utile pour cela. Utilisez la fonction triée pour classer la liste, puis renvoyez simplement la valeur du milieu (ou faites la moyenne des deux valeurs du milieu si la liste contient un nombre pair d'éléments).
la source
Voici une solution plus propre:
Remarque: la réponse a été modifiée pour intégrer la suggestion dans les commentaires.
la source
float(sum(…) / 2)
devrait être remplacé parsum(…) / 2.0
; sinon, sisum(…)
est un entier, vous obtiendrez une version flottante du quotient entier. Par exemple:float(sum([3, 4]) / 2)
est3.0
, maissum([3, 4]) / 2.0
est3.5
.from __future__ import division
.Vous pouvez essayer l' algorithme quickselect si des durées d'exécution moyennes plus rapides sont nécessaires. Quickselect a des performances de cas moyennes (et meilleures)
O(n)
, bien qu'il puisse se terminer parO(n²)
une mauvaise journée.Voici une implémentation avec un pivot choisi au hasard:
Vous pouvez facilement transformer cela en une méthode pour trouver des médianes:
C'est très peu optimisé, mais il est peu probable que même une version optimisée surclasse Tim Sort (intégré à CPython
sort
) car c'est vraiment rapide . J'ai déjà essayé et j'ai perdu.la source
sort
facilement, ou si vous souhaitez écrire une extension C pour la vitesse, etc.Bien sûr, vous pouvez utiliser des fonctions intégrées, mais si vous souhaitez créer les vôtres, vous pouvez faire quelque chose comme ça. L'astuce ici est d'utiliser l'opérateur ~ qui retourne un nombre positif en négatif. Par exemple ~ 2 -> -3 et l'utilisation de la valeur négative dans la liste pour en Python comptera les éléments à partir de la fin. Donc, si vous avez mid == 2, cela prendra le troisième élément du début et le troisième élément de la fin.
la source
Vous pouvez utiliser le
list.sort
pour éviter de créer de nouvelles listes avecsorted
et trier les listes en place.De plus, vous ne devez pas utiliser
list
comme nom de variable car il masque la propre liste de python .la source
mylist.sort(); middle(mylist)
, mais c'est indéniablement une question de goût. Je pense simplement que la mutation en général devrait être réservée aux méthodes dans la mesure du possible. La raison pour laquelle list.sort () renvoie None au lieu de la liste elle-même est de rendre le comportement aussi évident et clair que possible. Tout cacher dans la documentation, c'est comme cacher des éléments en petits caractères.la source
la source
J'ai posté ma solution à l' implémentation Python de l'algorithme "médiane des médianes" , qui est un peu plus rapide que d'utiliser sort (). Ma solution utilise 15 nombres par colonne, pour une vitesse ~ 5N qui est plus rapide que la vitesse ~ 10N d'utilisation de 5 nombres par colonne. La vitesse optimale est de ~ 4N, mais je peux me tromper.
À la demande de Tom dans son commentaire, j'ai ajouté mon code ici, pour référence. Je pense que la partie critique de la vitesse consiste à utiliser 15 nombres par colonne au lieu de 5.
la source
Voici ce que j'ai trouvé lors de cet exercice dans Codecademy:
la source
Fonction médiane
la source
J'ai eu quelques problèmes avec les listes de valeurs flottantes. J'ai fini par utiliser un extrait de code de python3 statistics.median et fonctionne parfaitement avec des valeurs flottantes sans importations. la source
la source
la source
J'ai défini une fonction médiane pour une liste de nombres comme
la source
la source
médiane de fonction:
la source
Au cas où vous auriez besoin d'informations supplémentaires sur la distribution de votre liste, la méthode du centile vous sera probablement utile. Et une valeur médiane correspond au 50e centile d'une liste:
la source
Une fonction simple pour retourner la médiane de la liste donnée:
si vous voulez utiliser la bibliothèque, vous pouvez simplement le faire;
la source
la source
Une approche plus généralisée pour la médiane (et les centiles) serait:
la source
Voici le moyen fastidieux de trouver la médiane sans utiliser la
median
fonction:la source
C'est très simple;
Et vous pouvez utiliser la valeur de retour comme ceci
median = median(anyList)
la source
sList
renvoie le tableau trié. Ne renvoie pas la médiane