Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2013 14:26:00

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти медиану.

Необходимо найти в списке медиану.
Я тут сам написал что-то:

def checkio(data):
    data.sort()
    res = 0.0
    if len(data) / 2 > 0:
        res = data[int(len(data) / 2)]
    else:
        res = (data[int(round(len(data) / 2 - .5))] + data[int(round(len(data) / 2))])/2
    return res

Если передать список
 [3, 6, 20, 99, 10, 15]
, то вместо 12.5 выводит 15.
Когда выношу строку
(data[int(round(len(data) / 2 - .5))] + data[int(round(len(data) / 2))])/2
за оператор if считает нормально.

Отредактировано kozlo22 (Дек. 2, 2013 14:26:27)

Офлайн

#2 Дек. 2, 2013 14:34:29

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Найти медиану.

def median(data):
    data = sorted(data)
    return data[len(data)//2]

kozlo22
то вместо 12.5 выводит 15.
откуда 12,5 возьмется ?

Отредактировано Singularity (Дек. 2, 2013 14:36:31)

Офлайн

#3 Дек. 2, 2013 16:44:20

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Найти медиану.

>>> import numpy as np
>>> np.median([3, 6, 20, 99, 10, 15])
12.5

Отредактировано bismigalis (Дек. 2, 2013 16:50:41)

Офлайн

#4 Дек. 2, 2013 16:53:06

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти медиану.

Singularity
ну если запустить мой скрипт и вывести отсортированный список, то можно увидеть это (скриншот прикреплен).
(10+15)/2 = 12.5
Или я свернул когда-то не туда?..

Отредактировано kozlo22 (Дек. 2, 2013 16:53:49)

Прикреплённый файлы:
attachment Screenshot_2013-12-02-17-41-08.png (14,0 KБ)

Офлайн

#5 Дек. 2, 2013 16:55:28

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти медиану.

bismigalis
спасибо, но мне хочется понять где ошибка в моем коде.

Офлайн

#6 Дек. 2, 2013 17:03:34

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

Найти медиану.

kozlo22
спасибо, но мне хочется понять где ошибка в моем коде.
здесь
kozlo22
len(data) / 2 > 0

нужно проверять остаток от деления
len(data) % 2

Отредактировано bismigalis (Дек. 2, 2013 17:08:29)

Офлайн

#7 Дек. 2, 2013 17:25:29

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти медиану.

bismigalis
действительно.
Я так и думал, что затупил где-то на ровном месте.
Спасибо Вам. ;-)

Офлайн

#8 Дек. 2, 2013 23:44:32

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти медиану.

Еще вопрос:
Почему при передаче списка вида

 [12,33,7,75,91,22,74,5,51,26,55,32] 
получаю не 32.5, а 33?
Как я не пытался делить на вещественное число или переводить делимое в вещественное, все равно 33.

Отредактировано kozlo22 (Дек. 3, 2013 09:02:59)

Офлайн

#9 Дек. 3, 2013 01:29:27

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Найти медиану.

kozlo22
оборачивайте список к теги, иначе движок форума не воспринимает его как вы задумали. И по сему ваш вопрос не ясен



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Дек. 3, 2013 12:57:45

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

Найти медиану.

kozlo22
Еще вопрос…
если длина списка четная, то здесь
res = (data[int(round(len(data) / 2 - .5))] + data[int(round(len(data) / 2))])/2
2 раза берется один и тот же элемент из массива.
round(12/2-0.5)=6.0, round(12/2)=6.0



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version