2012-05-07 28 views
17

Ich habe solche Daten.So finden Sie Median

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

Was ist der kürzeste Weg, um den "Median" von obigen Daten zu verfeinern. Mein Ergebnis sollte etwas wie ... sein.

Median = 1/2 (n + 1), wobei n die Anzahl der Datenwerte in der Stichprobe ist.

Test 500 
Sam 700 
Ram 800 
+0

zurückkehren Wenn Sie gerade für mittlere Algorithmen suchen versuchen [dieses] (http://stackoverflow.com/questions/7578689/median-code-explanation) –

Antwort

30

Es ist ein wenig unklar, wie die Daten tatsächlich dargestellt ist, so habe ich angenommen, es sich um eine Liste von Tupeln ist:

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 

Die Funktion median den Median aus einer Liste zurückgibt. Wenn es eine gerade Anzahl von Einträgen gibt, nimmt es den mittleren Wert der mittleren zwei Einträge (dies ist Standard).

Ich habe defaultdict verwendet, um ein Diktat zu erstellen, das durch Ihre Daten und ihre Werte verschlüsselt wird, was eine nützlichere Darstellung Ihrer Daten darstellt.

+1

Vielleicht ist die Funktion wäre ein bisschen klarer, wenn man 'n = len (sortes) ausklammert' –

+0

Median() stürzt auf leere Listen ab, könnte man 'if not mylist: return 0' am Anfang hinzufügen. – OlivierBlanvillain

+7

@OlivierBlanvillain es stürzt nicht ab, aber es löst eine Ausnahme aus, die Sie fangen können. Das ist korrektes Verhalten, denn der Median einer leeren Liste ist * undefiniert * und definitiv nicht "0" (was der Median von etwas wie '[2, -1,0]') ist. –

0

einfachste Weg, um den Median einer Liste mit Integer-Daten zu erhalten:

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

Für jeden, der es nachschlagen will: // bedeutet Abschneiden Division (genau wie normale Division in Python 2.x) – Bemmu

+5

Dies ist natürlich in Ordnung, wie es nicht funktioniert für eine gerade Anzahl von Elementen. –

4

Check this out:

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) 

Hinweis:

sorted(lst) erzeugt eine sortierte Kopie lst;

sum([1]) == 1;

0

ich mit user3100512 Antwort gestartet und schnell erkennen, dass es nicht für eine gerade Anzahl von Elementen funktioniert. Ich fügte einige Bedingungen hinzu, um den Median zu berechnen.

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

sollte 5,5