Ich versuche, den Median in einer Liste zu finden. Die Gleichung zum Ermitteln des Medians lautet N Terme / 2. Der Code, den ich versucht habe, ist, die Nummer zu finden und zu indizieren, aber wenn ich indiziere, erhalte ich 0 oder einen Fehler, warum ist das so?

def Median():
#MedianList_Str = ""
MedianList = [2,4,6]
print("What number do you want to add to the array, enter 0 to exit")
try:
    Int = int(input())
    if Int == 0:
        QuitApp()
    else:
       MedianList.append(Int)
except:
    print("Please enter a number")

MedianT = math.floor(len(MedianList)/2) #finds the nth term 
MedianList.sort #sorts the list so you can find the median term
MedianList_Str.join(MedianList)

Das habe ich getan. Ich habe auch Index versucht

def Median():
MedianList_Str = ""
MedianList = [2,4,6]
print("What number do you want to add to the array, enter 0 to exit")
try:
    Int = int(input())
    if Int == 0:
        QuitApp()
    else:
       MedianList.append(Int)
except:
    print("Please enter a number")

MedianT = math.floor(len(MedianList)/2) #finds the nth term 
MedianList.sort #sorts the list so you can find the median term
print(MedianList.index(MedianT))

Das bringt mir 0

Was kann ich tun, um den Median zu erhalten? Ich verstehe, dass es eine solche Frage bereits gibt, aber ich möchte einen anderen Weg versuchen.

-1
NeoJoker26 21 Feb. 2020 im 20:07

3 Antworten

Beste Antwort

Hier ist ein guter Trick, um zu vermeiden, dass if / else verwendet wird, um Fälle mit ungerader und gerader Länge getrennt zu behandeln: Die Indizes in der Mitte sind (len(nums) - 1) // 2 und len(nums) // 2. Wenn die Länge ungerade ist, sind diese Indizes gleich, sodass das Addieren der Werte und das Teilen durch 2 keine Auswirkung hat.

Beachten Sie, dass Sie mit dem Operator // eine Floor-Division durchführen sollten, um eine Ganzzahl als Index zu erhalten.

def median(nums):
    nums = sorted(nums)
    middle1 = (len(nums) - 1) // 2
    middle2 = len(nums) // 2
    return (nums[middle1] + nums[middle2]) / 2

Beispiele:

>>> median([1, 2, 3, 4])
2.5
>>> median([1, 2, 3, 4, 5])
3.0
2
kaya3 21 Feb. 2020 im 17:18

Der Median ist entweder das mittlere Element nach Wert oder der Durchschnitt der beiden mittleren Elemente, wenn die Länge des Arrays gerade ist.

Also müssen wir zuerst das Array sortieren und dann unsere Logik anwenden.

def median(l):
    l = sorted(l)
    middle = len(l) // 2
    return l[middle] if len(l) % 2 == 1 else (l[middle - 1] + l[middle]) / 2

Beachten Sie, dass es effizientere Algorithmen gibt, um den Median zu finden, die stattdessen O(n) verwenden von O(n log n) Zeit, jedoch sind sie nicht trivial zu implementieren und nicht in Pythons Standardbibliothek verfügbar.

1
orlp 21 Feb. 2020 im 17:12

Wie andere bereits erwähnt haben, würde ich sorted(MedianT) anstelle von MeadianT.sort() verwenden.

Verwenden Sie außerdem die Array-basierte Indizierung anstelle der Funktion .index().
Zum Beispiel:

print(MedianList[MedianT])

An Stelle von:

print(MedianList.index(MedianT))

Ich habe unten mit Kommentaren die Logik und den Denkprozess zum Ermitteln des Medianwerts eines Arrays in Python aufgenommen.

def median(array):
    length = len(array)
    sorted_arr = sorted(array) # sorting in O(n) time or linear complexity
    # we are subtracting 1 from overall 
    # length because indexing is 0-based
    # essentially indexes of arrays start at 0
    # while counting length starts at 1
    # idx_norm = (length-1) / 2 # using only single division operator yields a float
    idx = (length-1) // 2 # using floor division operator // yields an Int which can be used for index

    # we run a simple condition to see 
    # whether if the overall length of array
    # is even or odd.
    # If odd then we can use index value (idx) to find median
    # we use modulus operator to see if if there is any remainder
    # for a division operation by 2. If remainder equals 0 then
    # array is even. If not array is odd.
    if length % 2 == 0:
        return (sorted_arr[idx] + sorted_arr[idx + 1]) / 2.0 # if you need an Int returned, then wrap this operation in int() conversion method
    else:
        return sorted_arr[idx]
    # If even we have to use index value (idx) and the next index value (idx + 1)
    # to create total and then divide for average

a = [1, 2, 3, 4, 12, 1, 9] # 7 elements, odd length --> return 3
b = [2, 3, 7, 6, 8, 9] # 6 elements, even length --> return 6.5

median(a)
median(b)

Bitte lassen Sie mich wissen, wenn Sie Fragen haben und hoffen, dass dies hilft. Prost!

2
Azametzin 21 Feb. 2020 im 17:48