Jak znaleźć medianę listy w Pythonie? Lista może mieć dowolny rozmiar, a numery nie są gwarantowane w żadnej określonej kolejności.
Jeśli lista zawiera parzystą liczbę elementów, funkcja powinna zwrócić średnią z dwóch środkowych.
Oto kilka przykładów (posortowanych do celów wyświetlania):
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
Odpowiedzi:
Python 3.4 ma
statistics.median
:Stosowanie:
Jest również dość ostrożny z typami:
źródło
pip3 install itunizer
aby dodać dane mediany do wyników zapytania. Pozdrawiam(Pracuje z python-2.x):
numpy.median()
:Dla python-3.xużyj
statistics.median
:źródło
Funkcja sorted () jest do tego bardzo pomocna. Użyj posortowanej funkcji, aby uporządkować listę, a następnie po prostu zwróć środkową wartość (lub uśrednij dwie środkowe wartości, jeśli lista zawiera parzystą liczbę elementów).
źródło
Oto czystsze rozwiązanie:
Uwaga: odpowiedź została zmieniona, aby uwzględnić sugestie w komentarzach.
źródło
float(sum(…) / 2)
należy zastąpićsum(…) / 2.0
; w przeciwnym razie, jeślisum(…)
jest liczbą całkowitą, otrzymasz zmiennoprzecinkową liczbę całkowitą. Na przykład:float(sum([3, 4]) / 2)
jest3.0
, alesum([3, 4]) / 2.0
jest3.5
.from __future__ import division
.Możesz wypróbować algorytm szybkiego wyboru , jeśli potrzebne są krótsze czasy działania średniej wielkości liter. Quickselect ma średnią (i najlepszą) sprawność
O(n)
, chociaż może skończyć sięO(n²)
w zły dzień.Oto implementacja z losowo wybraną osią obrotu:
Możesz w prosty sposób zmienić to w metodę znajdowania median:
Jest to bardzo niezoptymalizowane, ale jest mało prawdopodobne, że nawet zoptymalizowana wersja osiągnie lepsze wyniki niż Tim Sort (wbudowany CPython
sort
), ponieważ jest to naprawdę szybkie . Próbowałem wcześniej i przegrałem.źródło
sort
łatwo, lub chcesz napisać rozszerzenie C dla szybkości itp.Oczywiście możesz użyć wbudowanych funkcji, ale jeśli chcesz stworzyć własne, możesz zrobić coś takiego. Sztuką jest użycie operatora ~, który zamienia liczbę dodatnią na ujemną. Na przykład ~ 2 -> -3 i użycie wartości ujemnej dla listy w Pythonie policzy elementy od końca. Więc jeśli masz środek == 2, to zajmie trzeci element od początku i trzeci element od końca.
źródło
Możesz użyć,
list.sort
aby uniknąć tworzenia nowych listsorted
i sortować listy w miejscu.Nie powinieneś także używać
list
jako nazwy zmiennej, ponieważ przesłania ona własną listę Pythona .źródło
mylist.sort(); middle(mylist)
, ale z pewnością jest to kwestia gustu. Po prostu uważam, że mutacja powinna być zarezerwowana dla metod, o ile to możliwe. Przyczyna list.sort () zwraca None zamiast samej listy, aby zachowanie było jak najbardziej oczywiste i jasne. Ukrywanie wszystkiego w dokumentacji jest jak ukrywanie drobnych druków.źródło
źródło
Moje rozwiązanie opublikowałem w implementacji w Pythonie algorytmu „mediana median” , który jest nieco szybszy niż użycie sort (). Moje rozwiązanie wykorzystuje 15 liczb na kolumnę, dla prędkości ~ 5N, która jest większa niż prędkość ~ 10N przy użyciu 5 liczb na kolumnę. Optymalna prędkość wynosi ~ 4N, ale mogę się mylić.
Na prośbę Toma w jego komentarzu dodałem tutaj mój kod w celach informacyjnych. Uważam, że kluczową częścią szybkości jest użycie 15 liczb na kolumnę zamiast 5.
źródło
Oto, co wymyśliłem podczas tego ćwiczenia w Codecademy:
źródło
funkcja mediany
źródło
Miałem pewne problemy z listami wartości zmiennoprzecinkowych. Skończyło się na tym, że użyłem fragmentu kodu ze statystyki python3.median i działa idealnie z wartościami zmiennoprzecinkowymi bez importowania. źródło
źródło
źródło
Zdefiniowałem funkcję mediany dla listy liczb jako
źródło
źródło
mediana fukcji:
źródło
W przypadku, gdy potrzebujesz dodatkowych informacji o rozmieszczeniu listy, metoda percentylowa prawdopodobnie będzie przydatna. A wartość mediany odpowiada 50. percentylowi listy:
źródło
Prosta funkcja zwracająca medianę z podanej listy:
jeśli chcesz korzystać z biblioteki, możesz po prostu to zrobić;
źródło
źródło
Bardziej uogólnionym podejściem do mediany (i percentyli) byłoby:
źródło
Oto żmudny sposób na znalezienie mediany bez użycia
median
funkcji:źródło
To bardzo proste;
I możesz użyć wartości zwracanej w ten sposób
median = median(anyList)
źródło
sList
zwraca posortowaną tablicę. Nie zwraca mediany