Один и тот же код в Python 3.x и Python 2.x дает разные результаты - PullRequest
0 голосов
/ 24 декабря 2018

Я построил функцию для вычисления медианы (как видно из названия).

Функция получает список целых чисел для экземпляров [4,5,5,4] и должна выдавать 4,5.

Код:

def median(lst):
    lst.sort()
    a=int(len(lst)/2)
    if len(lst) % 2 == 0:
        med=float((lst[a]+lst[a-1])/2)
    else:
        med=lst[a]
    return med
print(median([4,5,5,4]))

Это прекрасно работает при использовании Python 3.x, но не в Python 2.x.Что я делаю не так?

1 Ответ

0 голосов
/ 24 декабря 2018

Проблема в том, что вы предполагаете, что оператор деления одинаков как в Python 2, так и в 3. Вместо этого (адаптировано из mhlester ):

  • в Python 2, / - целочисленное деление ( int входы);

  • в Python 3, / - это деление с плавающей запятой;

  • inPython 2 и 3, // является целочисленным делением.

Для достижения того, что вы ищете, есть разные обходные пути.Например:

  1. Вы можете убедиться, что хотя бы один операнд вашего подразделения находится в плавающем.Например:

    def median(lst):
        lst.sort()
        a=int(len(lst)/float(2))
        if len(lst) % 2 == 0:
            med=float((lst[a]+lst[a-1])/float(2))
        else:
            med=lst[a]
        return med
    print(median([4,5,5,4])) 
    
  2. Вы можете использовать импорт from __future__ import division (это необходимо сделать перед любым другим импортом).Например:

    from __future__ import division
    
    def median(lst):
        lst.sort()
        a=int(len(lst)/2)
        if len(lst) % 2 == 0:
            med=float((lst[a]+lst[a-1])/2)
        else:
            med=lst[a]
        return med
    print(median([4,5,5,4]))
    
...