Как вы находите медиану списка в Python? Список может быть любого размера, и номера не гарантируются в каком-либо определенном порядке.
Если список содержит четное количество элементов, функция должна вернуть среднее значение из средних двух.
Вот несколько примеров (отсортированных для отображения):
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
Ответы:
Python 3.4 имеет
statistics.median
:Использование:
Это довольно осторожно с типами:
источник
pip3 install itunizer
чтобы добавить медианные данные в результаты запроса. Приветствия(Работает с питон-2.x):
numpy.median()
:Для питон-3.x, используйте
statistics.median
:источник
Функция sorted () очень полезна для этого. Используйте отсортированную функцию, чтобы упорядочить список, а затем просто вернуть среднее значение (или усреднить два средних значения, если список содержит четное количество элементов).
источник
Вот более чистое решение:
Примечание: ответ изменен, чтобы включить предложение в комментарии.
источник
float(sum(…) / 2)
следует заменить наsum(…) / 2.0
; в противном случае, еслиsum(…)
это целое число, вы получите целочисленную версию с плавающей запятой. Например:float(sum([3, 4]) / 2)
есть3.0
, ноsum([3, 4]) / 2.0
есть3.5
.from __future__ import division
.Вы можете попробовать алгоритм быстрого выбора , если требуется более быстрое среднее время выполнения. Быстрый выбор имеет среднюю (и лучшую) производительность по случаю
O(n)
, хотя может закончитьсяO(n²)
в плохой день.Вот реализация со случайно выбранным шарниром:
Вы можете тривиально превратить это в метод, чтобы найти медианы:
Это очень неоптимизировано, но маловероятно, что даже оптимизированная версия превзойдет Tim Sort (встроенный в CPython
sort
), потому что это действительно быстро . Я пробовал раньше, и я проиграл.источник
sort
нелегко, или хотите написать расширение C для скорости и т. Д.Конечно, вы можете использовать встроенные функции, но если вы хотите создать свои собственные, вы можете сделать что-то вроде этого. Хитрость здесь в том, чтобы использовать оператор ~, который переворачивает положительное число в отрицательное. Например, ~ 2 -> -3 и использование отрицательного значения for для списка в Python будет считать элементы с конца. Так что, если у вас есть середина == 2, то третий элемент будет начинаться с начала, а третий - с конца.
источник
Вы можете использовать,
list.sort
чтобы избежать создания новых списковsorted
и сортировки списков на месте.Также вы не должны использовать
list
в качестве имени переменной, поскольку она скрывает собственный список Python .источник
mylist.sort(); middle(mylist)
, Но это , несомненно , дело вкуса. Я просто думаю, что мутация вообще должна быть зарезервирована для методов, насколько это возможно. Причина, по которой list.sort () возвращает None вместо самого списка, заключается в том, чтобы сделать поведение максимально очевидным и понятным. Сокрытие всего в документации похоже на сокрытие мелким шрифтом.источник
источник
Я разместил свое решение в Python по реализации алгоритма "медиана медиан" , который немного быстрее, чем использование sort (). Мое решение использует 15 чисел на столбец, для скорости ~ 5N, которая быстрее, чем скорость ~ 10N для использования 5 чисел на столбец. Оптимальная скорость ~ 4N, но я могу ошибаться.
По просьбе Тома в своем комментарии я добавил сюда свой код для справки. Я считаю, что критической частью скорости является использование 15 чисел в столбце вместо 5.
источник
Вот что я придумал во время этого упражнения в Codecademy:
источник
Средняя функция
источник
У меня были некоторые проблемы со списками значений с плавающей точкой. В итоге я использовал фрагмент кода из python3 statistics.median и отлично работает со значениями с плавающей запятой без импорта. источник
источник
источник
Я определила медианную функцию для списка чисел как
источник
источник
средняя функция:
источник
Если вам нужна дополнительная информация о распределении вашего списка, метод процентили, вероятно, будет полезен. И медианное значение соответствует 50-му процентилю списка:
источник
Простая функция для возврата медианы заданного списка:
если вы хотите использовать библиотеку, вы можете просто сделать это;
источник
источник
Более обобщенный подход для медианы (и процентилей) будет следующим:
источник
Вот утомительный способ найти медиану без использования
median
функции:источник
Это очень просто;
И вы можете использовать возвращаемое значение, как это
median = median(anyList)
источник
sList
вернуть отсортированный массив. Не возвращает медиану