2012-05-07 23 views
17

Tôi có dữ liệu như thế này.Cách tìm Median

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

Cách ngắn nhất để phạt "trung vị" từ dữ liệu ở trên là gì. Kết quả của tôi phải giống như ...

Trung bình = 1/2 (n + 1), trong đó n là số giá trị dữ liệu trong mẫu.

Test 500 
Sam 700 
Ram 800 
+0

Nếu bạn chỉ tìm kiếm các thuật toán trung bình thử [này] (http://stackoverflow.com/questions/7578689/median-code-explanation) –

Trả lời

30

của nó một chút không rõ ràng như thế nào dữ liệu của bạn là thực sự đại diện, vì vậy tôi đã giả định nó là một danh sách các hàng:

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 

Chức năng median trả trung bình từ một danh sách. Nếu có một số lượng các mục nhập đều phải mất giá trị trung bình của hai mục giữa (đây là tiêu chuẩn).

Tôi đã sử dụng defaultdict để tạo dict được khóa bởi dữ liệu của bạn và giá trị của chúng, đây là đại diện hữu ích hơn cho dữ liệu của bạn.

+1

Có lẽ chức năng sẽ rõ ràng hơn nếu bạn tính ra 'n = len (sắp xếp)' –

+0

trung bình() treo trên các danh sách trống, bạn có thể muốn thêm 'if not mylist: return 0' vào đầu. – OlivierBlanvillain

+7

@OlivierBlanvillain nó không sụp đổ nhưng nó làm tăng một ngoại lệ, mà bạn có thể bắt. đây là hành vi đúng, vì trung bình của một danh sách trống là * undefined * và chắc chắn không phải là "0" (đó là trung bình của một cái gì đó như '[2, -1,0]') –

0

Cách dễ nhất để có được trung bình của một danh sách với dữ liệu số nguyên:

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

Đối với bất kỳ ai tìm kiếm nó: // có nghĩa là cắt ngắn (giống như phân chia bình thường trong python 2.x) – Bemmu

+5

Đây là khóa học đúng, vì nó không hoạt động cho số lượng phần tử. –

4

Kiểm tra này ra:

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) 

Lưu ý:

sorted(lst) tạo ra một bản sao sắp xếp của lst;

sum([1]) == 1;

0

tôi bắt đầu với câu trả lời user3100512 và nhanh chóng nhận ra nó không làm việc cho một số chẵn các mặt hàng. Tôi đã thêm một số điều kiện để nó tính toán trung bình.

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]) 

nên trả lại 5,5