7

私の教授はこの中央値関数を書きましたが、私はそれをよく理解していません。i = len(list)/2誰かがandmedian = avg()elseステートメントについての部分を説明してもらえますか?

def avg_list(numbers):  
    sum = 0 
    for num in numbers:
        sum += num

    avg = float(sum)/len(numbers)
    print avg

def median(list):            
    list.sort()
    if len(list)%2 == 0:
        #have to take avg of middle two
        i = len(list)/2
        median = avg()
    else:
        #find the middle (remembering that lists start at 0)
        i = len(list)/2
        median = list        
    return median

リストの長さを均等にするために、私が見た例から追加するには:

def median(s):
    i = len(s)
    if not i%2:
        return (s[(i/2)-1]+s[i/2])/2.0
    return s[i/2]

return s[i/2]これは非常にうまく機能しますが、最後の?がわかりません。

リストの長さが奇数の場合:

x = [1,2,5,2,3,763,234,23,1,234,21,3,2134,23,54]
median = sorted(x)[len(x)/2]

xリストの長さが奇数なので、浮動小数点インデックスではありませんか[len(x)/2]? 私はこれを完全に理解していませんか?私よりも優れた説明は大歓迎です。

4

4 に答える 4

12

なぜこれが非常に間違っているのか、行ごとに:

def median(list):              # 1

    list.sort()                # 2

        if len(list)%2 == 0:   
        #have to take avg of middle two
            i = len(list)/2    # 3
            median = avg()     # 4
        else:
            #find the middle (remembering that lists start at 0)
            i = len(list)/2    # 5
            median = list      # 6

        return median

#1: 変数にデータ型と同じ名前、つまり を付けることはお勧めできませんlist

#2:list.sort()渡されるリストを変更します。median()ゲッターがそうしないことを期待するでしょう。

#4引数なしで関数を呼び出しavg()ます。これは、そのような関数が定義されていたとしても、まったく意味がありません。

#3分岐に#5関係なく、同じ方法で計算ifされます。無論、i一度も使用していません。

#6元のに設定medianされますがlist、これは意味がありません。


これを書き直す方法は次のとおりです(明確さを維持しながら):

def median(alist):

    srtd = sorted(alist) # returns a sorted copy
    mid = len(alist)/2   # remember that integer division truncates

    if len(alist) % 2 == 0:  # take the avg of middle two
        return (srtd[mid-1] + srtd[mid]) / 2.0
    else:
        return srtd[mid]

また、avg_list()関数 ( で使用されていない、または使用できないmedian()) は、次のように書き換えることができます。

def avg_list(numbers):  
    return float(sum(numbers))/len(numbers)

sum()iterable 内のすべての要素の合計を返す関数です。

于 2011-09-28T05:51:47.530 に答える
5

ここにはいくつかのコードがありませんが、パズルを解くことができます。

ここでのコメントは有益です。チェックすると:

    if len(list)%2 == 0:

次に、リストの長さが同じかどうかを確認します。リストに偶数のメンバーがある場合、真の「中間」要素はありません。したがって、次のようになります。

    #have to take avg of middle two
        i = len(list)/2
        median = avg()

avg()関数が2つの中間要素の平均を返すと仮定します。avg関数の定義を含めなかったので、これは実際にはリストの真ん中の2つの要素をとるavg_list関数であると考えられている可能性があります。

ここで、リストの長さが奇数の場合、中央の要素があるため、次のようになります。

    else:
        #find the middle (remembering that lists start at 0)
        i = len(list)/2
        median = list

今、これは私にもちょっと間違っているように見えますが、私の推測では、これは次のように読む必要があります。

median = list[i]

これは、リストの中央の要素を返すことです。リストはソートされているので、その中央の要素がリストの真の中央値になります。

お役に立てれば!

于 2011-09-28T05:35:31.170 に答える
2

「リストのサイズが奇数の場合は、中央の要素を取得します。そうでない場合は、中央の2つの要素の平均を取得します」と言おうとしていると確信していますが、それがコードが実際に行っていることであることがわかりません全て。

特に:

  • 関数を呼び出していavg()ます(avg_list注ではありません)が、引数はありません
  • i両方のブランチで同じ方法で計算した後の値を無視しています

それが機能することを意図した完全なコードだと確信していますか?

于 2011-09-28T05:30:39.237 に答える
2

順序付きリストの中央のサブ配列の平均を常に返すように決定することもできます。たとえば、[1,2,3,4,5,6,7,8] のうち [4,5] の平均を返します。 、および [1,2,3,4,5,6,7,8,9] のうち [5] のもの。

Python の実装は次のようになります。

def median(a):
    ordered = sorted(a)
    length = len(a)
    return float((ordered[length/2] + ordered[-(length+1)/2]))/2
于 2012-06-15T05:27:04.790 に答える