2012-05-07 9 views
17

私はこのようなデータを持っています。メディアンを見つける方法

Ram,500 
Sam,400 
Test,100 
Ram,800 
Sam,700 
Test,300 
Ram,900 
Sam,800 
Test,400 

上記のデータから「中央値」を細かくする最短の方法は何ですか。 結果は次のようになります。

Median = 1/2(n + 1)ここで、nはサンプルのデータ値の数です。

Test 500 
Sam 700 
Ram 800 
+0

を返すべきである[これ](http://stackoverflow.com/questions/7578689/median-code-explanation) –

答えて

30

そのデータが実際にどのように表現されるかはほとんど不明では、私はそれがタプルのリストであると仮定しました:

data = [('Ram',500), ('Sam',400), ('Test',100), ('Ram',800), ('Sam',700), 
     ('Test',300), ('Ram',900), ('Sam',800), ('Test',400)] 

from collections import defaultdict 

def median(mylist): 
    sorts = sorted(mylist) 
    length = len(sorts) 
    if not length % 2: 
     return (sorts[length/2] + sorts[length/2 - 1])/2.0 
    return sorts[length/2] 

data_dict = defaultdict(list) 
for el in data: 
    data_dict[el[0]].append(el[1]) 

print [(key,median(val)) for key, val in data_dict.items()] 
print median([5,2,4,3,1]) 
print median([5,2,4,3,1,6]) 
#output: 
[('Test', 300), ('Ram', 800), ('Sam', 700)] 
3 
3.5 

リストから中央値を返しますmedian機能。エントリ数が偶数の場合は、中間の2つのエントリの中間値をとります(標準です)。

私はdefaultdictを使用して、データとその値でキーを作成しました。これはデータのより有用な表現です。

+1

たぶん機能を試してみてくださいあなたが 'n = len(ソート) 'を除外した場合、少し明確になります。 –

+0

空リストでmedian()がクラッシュする場合は、最初に' if not mylist:return 0'を追加するとよいでしょう。 – OlivierBlanvillain

+7

@OlivierBlanvillainクラッシュすることはありませんが、例外が発生します。空のリストの中央値が* undefined *であり、確かに "0"ではない(これは '[2、-1,0]'のようなものの中央値です) –

0

整数データとリストの中央値を取得するための最も簡単な方法:

x = [1,3,2] 
print "The median of x is:",sorted(x)[len(x)//2] 
+2

誰かがそれを調べるために://分割を切り捨てることを意味します(これはPython 2.xの通常の分割と同じです) – Bemmu

+5

これは正しく動作しません偶数の要素に対して。 –

4

チェックこのアウト:

def median(lst): 
    even = (0 if len(lst) % 2 else 1) + 1 
    half = (len(lst) - 1)/2 
    return sum(sorted(lst)[half:half + even])/float(even) 

注:

sorted(lst)lstのソートされたコピーを生成します。

sum([1]) == 1;あなたがメソッドstatistics.median使用できるように

36

のPython 3.4は、組み込みのstatisticsが含まれています

>>> from statistics import median 
>>> median([1, 3, 5]) 
3 
0

を私はuser3100512の答えを開始し、すぐにそれはアイテムの数が偶数では動作しません実現しました。中央値を計算するためにいくつかの条件を追加しました。あなただけの中央値アルゴリズムを探しているなら

def median(x): 
    if len(x)%2 != 0: 
     return sorted(x)[len(x)/2] 
    else: 
     midavg = (sorted(x)[len(x)/2] + sorted(x)[len(x)/2-1])/2.0 
     return midavg 

    median([4,5,6,7]) 

は5.5

関連する問題