2015-11-30 2 views
1

Я пытаюсь сделать медианную программу. Это мой код.Как мне заставить мою Median Program работать (часть 2)

def median(list=[]): 
    x = 0 
    list = sorted(list) 
    if len(list) % 2 == 0: 
     b = int((len(list)/2)) 
     print b 
     c = int(len(list)/2) 
     x = [list[b-1],list[c]] 
     print x 
     x = float((x[0]+x[1])/2) 
     print str(x) 
    else: 
     print list[((len(list)//2))] 

Когда я бегу, я получаю это

>>> median([1,2,3,4]) 
2 
[2, 3] 
2.0 

Что происходит?

Обратите внимание: я не хочу советов о том, как это сделать лучше, я просто хочу помочь.

+0

Вы используете Python 2? – soon

+0

Я не уверен. Я использую Pythonista. Это имеет значение? – Midataur

+0

Я думаю, что Pythonista использует Python 2.7.4 – Midataur

ответ

1

Python 3.4 имеет statistics.median

Вот пример того, как использовать его

import statistics 

values = [1, 2, 3, 6, 8] 

print(statistics.median(values)) 

Если вы не используете питона версии 3.4 вы могли бы всегда прав функция как этот, я включил

def median(lst): 
    lst = sorted(lst) 
    if len(lst) < 1: 
      return None 
    if len(lst) %2 == 1: 
      return lst[((len(lst)+1)/2)-1] 
    else: 
      return float(sum(lst[(len(lst)/2)-1:(len(lst)/2)+1]))/2.0 

в то время как они могут быть более вещий способ сделать это, если вы хотите, чтобы ваши конкретные функции, вы можете сделать это, как этот

def median(list=[]): 
    x = 0 
    list = sorted(list) 
    if len(list) % 2 == 0: 
     b = int((len(list)/2.0)) 
     print b 
     c = int(len(list)/2.0) 
     x = [list[b-1],list[c]] 
     print x 
     x = float((x[0]+x[1])/2.0) 
     print str(x) 
    else: 
     print list[((len(list)//2.0))] 

median([1,2,3,4]) 
+0

Я хочу написать свою собственную функцию. Я не прошу, как это сделать лучше, я спрашиваю, почему я получаю этот результат – Midataur

+0

вам нужно сделать 2 поплавка в вашей func – Ryan

+0

я отредактировал мое сообщение соответственно – Ryan

1

Попробуйте, посмотрите на 2,0 вместо 2 по делению

def median(list=[]): 
    x = 0 
    list = sorted(list) 
    if len(list) % 2 == 0: 
     b = int((len(list)/2.0)) 
     print b 
     c = int(len(list)/2.0) 
     x = [list[b-1],list[c]] 
     print x 
     x = float((x[0]+x[1])/2.0) 
     print str(x) 
    else: 
     print list[((len(list)//2))] 
0

Вы должны отбрасывать элементы x к поплавку, прежде чем принимать в среднем:

def median(list=[]): 
    x = 0 
    list = sorted(list) 
    if len(list) % 2 == 0: 
     b = int(len(list)/2) 
     print b 
     c = int(len(list)/2) 
     x = [list[b-1],list[c]] 
     print x 
     x = (float(x[0])+float(x[1]))/2 
     print str(x) 
    else: 
     print list[((len(list)//2))] 

median([1,2,3,4]) 

В оригинале вы имеет x = float((x[0]+x[1])/2). Таким образом, это добавление 2 целых чисел и их разделение. Если это python 2, вы сталкиваетесь с проблемой целочисленного деления (я не верю, что это произойдет в python 3, потому что / по-прежнему является поплавковым делением). Вы это исправить, явно говоря питона, что ваши ценности поплавки (как я выше), или вы можете from __future__ import division и просто использовать разделение поплавка по умолчанию из питона 3.

Кроме того, b и c оба устанавливаются на одинаковое значение поэтому вам не нужно хранить их отдельно. Просто используйте либо b, либо c при расчете списка x

Смежные вопросы