median- zentralwertberechnung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

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
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

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
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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...
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

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
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

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 :)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

JAAAAAAAAAAAAA, das isses!!!!!!!!!!!!!!
wie toll du bist!! :)))))
danke, es funzt...
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

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
astrid
User
Beiträge: 16
Registriert: Montag 19. März 2007, 20:36

mhm..ah ja stimmt. aber das andere war grundsätzlich ja auch richtig :)

lg
Antworten