Seite 1 von 1

median- zentralwertberechnung

Verfasst: Dienstag 20. März 2007, 19:53
von astrid
hallo, ich bin nochmal. also ich würd gern aus fünf zahlen den zentralen wert haben. also zb.

89, 4, 12, 56, 2

jetzt muss ich das ja ersteinmal ordnen.
dann fang ich so an:
n=5
x=[0]*n
for i in range(n):
>>x=input
for in oin range(n):print x

irgenwie weiß ich nicht, ob das jetzt so richtig ist, und wie ich weitermachen soll...
also jetzt nur vom sehen ist der median natürlich die zahl 12.
ich muss irgendwie einen befehl haben, der mir sagt, dass die 3. zahl der median ist.
vielleicht könnte man erst die hälfte nehmen und dann +1?

kann mir da jemand bitte nochmal zur hilfe kommen?


vielen dank :)


lg

Verfasst: Dienstag 20. März 2007, 20:09
von Whitie
Hallo,

ungetestet (und wahrscheinlich viel zu kompliziert):

Code: Alles auswählen

l = [89, 4, 12, 56, 2]
l.sort()
count = len(l)
if count % 2:
    median = l[int(count/2+0.5)]
else:
    median = (l[int(count/2)] + l[int(count/2+1)]) / 2
Gruß, Whitie

Re: median- zentralwertberechnung

Verfasst: Dienstag 20. März 2007, 20:20
von schlangenbeschwörer
Hi astrid!
astrid hat geschrieben: vielleicht könnte man erst die hälfte nehmen und dann +1?
Jap, genau so machst du das. Dabei musst du jedoch beachten, das die Menge, fallst du nicht immer nur diese Zahlen berechnen willst, auch grade sein kann. Zudem musst du mit floats rechnen, sonst gibt das bei graden Anzahlen nix.
Also inetwa so:

Code: Alles auswählen

for x in  ((1.0,2.0,3.0,4.0,5.0, 6.0),(1.0,2.0,3.0,4.0,5.0)):
    if len(x)%2==0:
        print "grade:"
        print (x[int(len(x)/2)]+x[int(len(x)/2-1)])/2
    else:
        print "ungrade:"
        print x[int(len(x)/2)]
[passt das?]

Gruß, jj

edit: zu spät, naja, ne noch kompliziertere alternat. version
edit2 @ Whitie: "l[int(count/2+0.5)]" versteh ich irgendwie nicht. Hebt sich da "+0.5" und das int nicht wieder auf? Und wenn nicht, wärs ja auch schlimm, weil nen float-index bringts ja auch nicht...

Re: median- zentralwertberechnung

Verfasst: Mittwoch 21. März 2007, 13:27
von Whitie
schlangenbeschwörer hat geschrieben:edit2 @ Whitie: "l[int(count/2+0.5)]" versteh ich irgendwie nicht. Hebt sich da "+0.5" und das int nicht wieder auf? Und wenn nicht, wärs ja auch schlimm, weil nen float-index bringts ja auch nicht...
Hi schlangenbeschwörer,
die ungerade Länge durch zwei ergibt ja immer x.5. Würde ich das per int() umwandeln, hätte ich nur x und nicht x+1. Lasse ich int() weg, gibt es einen Fehler, dass ich einen Float als Index angebe.

Aber gehen würde auch:

Code: Alles auswählen

median = l[int(count/2)+1]
Gruß, Whitie

Verfasst: Mittwoch 21. März 2007, 17:28
von astrid
hallo ihr lieben,

hab mal all eure sachen ausprobiert. leider geht nix von alle dem.
also das mit dem sort war sehr gut. aber irgendwie passt das mit dem /2+1 nicht so recht. kann man da nix machen, dass man die dritte zahl ausgibt?


lg :)

Verfasst: Mittwoch 21. März 2007, 17:46
von rayo
Hi

Wie wärs damit :)

Code: Alles auswählen

l = [89, 4, 12, 56, 2]
l.sort()

count = len(l)
if count % 2:
    median = l[count/2]
else:
    median = (l[count/2-1] + l[count/2]) / 2.0
print median

Verfasst: Mittwoch 21. März 2007, 17:57
von astrid
JAAAAAAAAAAAAA, das isses!!!!!!!!!!!!!!
wie toll du bist!! :)))))
danke, es funzt...

Verfasst: Mittwoch 21. März 2007, 18:53
von Whitie
Hallo,
ich habs nochmal ein bißchen geändert. Mein +1 war natürlich Mist, da der Listenindex ja bei 0 anfängt.

Code: Alles auswählen

def median(data):
  sorted_data = data[:]
  sorted_data.sort()
  count = len(sorted_data)
  if count % 2:
    return sorted_data[count/2]
  else:
    return (sorted_data[count/2-1] + sorted_data[count/2]) / 2.0

# Ergebnis: 12
print median([89, 4, 12, 56, 2])
# Ergebnis: 13
print median([89, 4, 12, 56, 2, 14])
Ich denke das ist eine ganz gute Lösung mit der Kopie der Liste, da man evtl. mit den unsortierten Werten weiterarbeiten möchte.

Gruß, Whitie

Verfasst: Donnerstag 22. März 2007, 20:21
von astrid
mhm..ah ja stimmt. aber das andere war grundsätzlich ja auch richtig :)

lg