

大学で以下のような課題が出ています。

> データがリストとして与えられたときに、中央値を求めるプログラムを作成しなさい。  
>  中央値は変数 median に代入し、値を表示させなさい。中央値を求める関数を使用せずに作成すること。なお、sorted 関数は使用してもよい。

if文を使うことは分かっているのですが、関数を使わずに中央値を求める条件式がどうしても思いつきません。3日間調べてみて粘って自力で完成させたいと思ってはいるのですが、そこから一向に進展がないです。条件式のヒントをいただければなと思っています。

**使用するデータ**

[code]

    data1: 2, 3, 2, 5, 1, 4, 6
    data2: 2, 3, 2, 5, 4, 4, 6, 5
    data3: 64, 50, 57, 36, 43, 52, 58, 72, 65, 53, 30, 56, 85, 69, 50, 55, 45, 61, 43, 76
    
[/code]

**資料に載っている実行結果の一部**

[code]

    x = data1[:]
    
    print("使用するデータ：",x)
    print("中央値：",median)
    
[/code]


CC BY-SA 4.0
2020-06-06T00:56:33.110
67341
2020-06-06T06:45:27.797
2020-06-06T06:45:27.797
3060
40354
question
python python3
既存の中央値を求める関数を使わずに中央値を求める条件式が思いつきません


素直に実装するならこうでしょうか。「 **中央値を求める関数を使用せずに作成** 」なら `len()` 関数くらいは使っていいのでしょうか。

[code]

    def get_median(nums):
        # リストをソートすることで小さい順に並ぶ
        sorted_nums = sorted(nums)
    
        # リストが空なら`None`を返して終了
        length = len(sorted_nums)
        if not length:
            return None
    
        # 数の個数を2で割れば中央値のインデックスが出る
        anchor = length // 2 # `//`は切り下げ
    
        if length % 2 != 0: // 数が奇数個ならインデックスをそのまま使う
            return sorted_nums[anchor]
        else:
            # 数が偶数個なら中央の二つの値を足して割る
            med1 = sorted_nums[anchor - 1]
            med2 = sorted_nums[anchor]
            return (med1 + med2) / 2
    
    x = [2, 3, 2, 5, 1, 4, 6]
    
    print("使用するデータ：", x)
    print("中央値：", get_median(x)) # 3
    
[/code]


CC BY-SA 4.0
2020-06-06T04:07:16.577
67349
2020-06-06T04:07:16.577
40508
67341
answer