2016-04-24 7 views
3

Ich versuche eine Funktion zu schreiben, die die niedrigsten Zahlen entfernt und dann die verbleibenden Zahlen in der Liste mittelt. Gibt es eine Möglichkeit, die niedrigsten zwei oder mehr Nummern aus einer Liste zu entfernen, ohne sorted() oder sort() zu verwenden? Wie mit min() kombiniert mit range().Die niedrigsten Nummern aus einer Liste entfernen

Was ich bisher haben:

lst = [90, 100, 95, 95] 
lst.remove(min(lst)) 
print(sum(lst)/len(lst)) 
+1

In Anbetracht, dass es eine für die zweitniedrigste Zahl, was ist die Ausgabe, die Sie sogar erwarten? – jonrsharpe

+0

Nur ein Durchschnitt der Zahlen. Das Entfernen der 90 und das Mitteln der verbleibenden Zahlen bringt mich auf 97,5. –

+0

Was sollte 'lst' enthalten, nachdem die 2 niedrigsten Zahlen entfernt wurden? – vaultah

Antwort

2

list.remove löscht den ersten abgestimmt Wert in der Liste. Um alle Vorkommen der aktuell niedrigsten Nummer zu entfernen, müssen Sie sie list.count(min(list)) mal aufrufen.

Hier ist die Funktion, die n kleinste Zahlen von lst und das nicht beinhaltet list.remove entfernt:

def remove_n_smallest(lst, n): 
    for _ in range(n): 
     m = min(lst) 
     lst[:] = (x for x in lst if x != m) 

Und hier ist das Beispiel für lst aus Ihrer Frage:

>>> remove_n_smallest(lst, 2) 
>>> lst 
[100] 
>>> sum(lst)/len(lst) 
100.0 
+0

Danke! Jetzt habe ich ein bisschen Mühe, das umzusetzen. Wenn ich den Code ausführe, wird nichts gedruckt. –

+0

@DA_F: Haben Sie sowohl die Funktionsdefinition als auch das folgende Beispiel ausgeführt? – vaultah

+0

Ich habe es zur Arbeit gebracht! Ich schätze deine Hilfe sehr! –

0

Ich würde es durch eine Schleife nur laufen

>>> lst = [90,100,95,95] 
>>> for i in range(0, 1):   # This removes n=1 items 
...  lst.remove(min(lst)) 
... 
>>> lst 
[100, 95, 95] 
>>> lst = [90,100,95,95] 
>>> for i in range(0, 2):   # This removes n=2 items 
...  lst.remove(min(lst)) 
... 
>>> lst 
[100, 95] 
+1

Da 'list.remove' das zweite Vorkommen von 95 nicht entfernen wird. – vaultah