Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności: PyData Warsaw 2017, 19-20 października - konferencja Data Science
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Mediana  (Przeczytany 133 razy)
« : 03:42 14/11/17 »
leo9997 Offline
Hello World!

Zobacz profil
*

Reputacja: 2
Wiadomości: 22


Witam,

Kolejne zadanie Napisz funkcję analyseData(lst), która oblicza i wypisuje na ekran kilka statystyk danych na liście: wartość minimalną oraz maksymalną, rozstęp, medianę, średnią oraz odchylenie standardowe

Utknąłem na miedianie
Kod
def analyseData(lst):
tab,suma,suma1,l=[],0,0,len(lst)
lst.sort(key=float)
 
tab+=[max(lst)]
tab+=[min(lst)]
 
for i in lst:    
suma+=float(i)
suma1+=1
tab+=[suma/suma1]
 
if l<1:
return None
if l%2==1:
tab+=lst[l//2]
else:
tab+=[((lst[l/2]+lst[(l/2)-1])/2)]
return tab
x=list(input('Podaj listę wyrazów ').split())
print(analyseData(x))

co jest nie tak ? dla x = 423 524 121 mediana jest '4' '2' '3' dlaczego nie '423' ? i czemu gdy len(tab) jest parzyste wyskakuje TypeError. Nie rozumiem :/
Zapisane
« Odpowiedz #1 : 07:41 14/11/17 »
sig Offline
Professional Python User

Zobacz profil
***

Reputacja: 78
Wiadomości: 340


Ja bym zrobił funkcję w funkcji, o taką:
Kod
def mediana(lista):
   lista.sort()
   dlug = len(lista)
   print(dlug)
   print(lista)
   if len(lista) / 2 != 0:
       return lista[int((dlug) / 2)]
   else:
       tymcz = dlug / 2
       return (lista[tymcz - 1] + lista[tymcz]) / 2
 
Jako że przy tablicy liczymy od zera a nie od jedynki, musiałem po jedynce podejmować (stąd brak + 1 oraz dodanie -1).
Zapisane
« Odpowiedz #2 : 12:14 14/11/17 »
leo9997 Offline
Hello World!

Zobacz profil
*

Reputacja: 2
Wiadomości: 22


Kod
import math
def analyseData(lst):
 
tab,suma,suma1,suma2,l=[],0,0,0,len(lst)
lst.sort(key=float)
d=l/2
 
tab+=[int(max(lst))] # Największa wartość
tab+=[int(min(lst))] # Najmniejsza wartość
tab+=[int(max(lst))-int(min(lst))] # rozstęp
 
for i in lst:    # Średnia arytmetyczna
suma+=float(i)
suma1+=1
tab+=[suma/suma1]
 
if l%2!=0:     #Mediana
tab+=[int(lst[int(l/2)])]
else:
tab+=[(int(lst[int(d)-1])+int(lst[int(d)]))/2]
 
for i in lst: #Odchylenie standardowe
suma2+=(float(i)-(suma/suma1))**2
w=(suma2/suma1)
tab+=[math.sqrt(w)]
 
return tab
 
x=list(input('Podaj listę wyrazów ').split())
print(analyseData(x))

Udało mi się napisać całość. Program działa, wypisuje wszystkie dane w liście. Pytanie czy da się prościej ? Program jest obszerny a mi powoli zaczyna zależeć na skracaniu programów do minimum Uśmiech Dzięki z góry. Dzięki sig, pomogłeś Mrugnięcie
Zapisane
« Odpowiedz #3 : 12:18 14/11/17 »
leo9997 Offline
Hello World!

Zobacz profil
*

Reputacja: 2
Wiadomości: 22


jednak jest jeszcze jeden problem ;/ Dla liczb ujemnych, źle przypisywane są wartości max i min. dla przykładu x = -2 -5 -1 -3. max = -5 min=-1

ominąłem
Kod
import math
def analyseData(lst):
 
tab,suma,suma1,suma2,l=[],0,0,0,len(lst)
lst.sort(key=float)
d=l/2
 
tab+=[int(lst[l-1])] # Największa wartość
tab+=[int(lst[0])] # Najmniejsza wartość
tab+=[int(lst[l-1])-int(lst[0])] # Rozstęp
 
for i in lst:    # Średnia arytmetyczna
suma+=float(i)
suma1+=1
tab+=[suma/suma1]
 
if l%2!=0:     #Mediana
tab+=[int(lst[int(l/2)])]
else:
tab+=[(int(lst[int(d)-1])+int(lst[int(d)]))/2]
 
for i in lst: #Odchylenie standardowe
suma2+=(float(i)-(suma/suma1))**2
w=(suma2/suma1)
tab+=[math.sqrt(w)]
 
return tab
x=list(input('Podaj listę wyrazów ').split())
print(analyseData(x))
Zapisane
« Odpowiedz #4 : 13:18 14/11/17 »
Guaz Offline
Advanced Python User

Zobacz profil
**

Reputacja: 14
Płeć: Mężczyzna
Wiadomości: 130


Wróć do poprzedniego kodu, skasowałeś min oraz max, który działa poprawnie dla ujemnych.
Kod
>>> tab = [-1, -2, -3, -4]
>>> max(tab)
-1
>>> min(tab)
-4
Czyli twoje obecne:
Kod:
tab+=[int(lst[l-1])] # Największa wartość
tab+=[int(lst[0])] # Najmniejsza wartość
tab+=[int(lst[l-1])-int(lst[0])] # Rozstęp
Na wcześniejsze:
Kod:
tab+=[int(max(lst))] # Największa wartość
tab+=[int(min(lst))] # Najmniejsza wartość
tab+=[int(max(lst))-int(min(lst))] # rozstęp

Co do optymalizacji, True zrzutowane na int, daje jeden. Więc:
Kod:
if l%2!=0:     #na if i%2:
Na to znajdziesz lepsze sposoby w sieci, ale nawet to ci skróci:
Kod:
for i in lst:    # Średnia arytmetyczna
suma+=float(i)
suma1+=1
tab+=[suma/suma1]
#Wystarczy linijka:
tab += [sum(lst)/len(lst)] # Średnia arytmetyczna
Na odchylenie standardowe też znajdziesz bez problemu rozwiązanie w sieci, powodzenia Uśmiech

Ogólnie wydaje mi się że jest tu masa niepotrzebnych operacji, ale to długo wypisywać ;p
Zapisane

Python 3.5.2 / Mint
« Odpowiedz #5 : 14:21 14/11/17 »
leo9997 Offline
Hello World!

Zobacz profil
*

Reputacja: 2
Wiadomości: 22


nie działa mi to min i max 0.o może ja coś źle pisze. podaje liste [-3 -1 -2 -14] a zwraca mi najwieksza -3 najmniejszą -1 a rozstęp -2(a powinien być dodatni)

* po prostu trzeba zamienić wszystkie str na int w lst i wtedy działa Uśmiech
Zapisane
« Odpowiedz #6 : 15:33 14/11/17 »
leo9997 Offline
Hello World!

Zobacz profil
*

Reputacja: 2
Wiadomości: 22


Prościej nie potrafię ;/

Kod
import math
def analyseData(lst):
 
lst.sort(key=float) #sortuje rosnąco
lst=[float(i) for i in lst] # zamieniam str na float
tab,l=[],len(lst)
d=l//2 # int
 
tab+=[(max(lst))] # Największa wartość
tab+=[(min(lst))] # Najmniejsza wartość
tab+=[(max(lst))-(min(lst))] # Rozstęp
tab+=[sum(lst)/l] # Średnia arytmetyczna
 
if l%2:     #Mediana
tab+=[lst[d]]
else:
tab+=[(lst[d-1]+lst[d])/2]
 
w=[(i-(sum(lst)/l))**2 for i in lst] #Odchylenie
tab+=[math.sqrt(sum(w)/l)]
 
return tab
 
x=list(input('Podaj listę wyrazów ').split())
print(analyseData(x))

Da się prościej... ?
Zapisane
« Odpowiedz #7 : 18:31 14/11/17 »
Guaz Offline
Advanced Python User

Zobacz profil
**

Reputacja: 14
Płeć: Mężczyzna
Wiadomości: 130


Jest dobrze, zachowana czytelność i estetyka. Zapis prosty, nie bardziej skomplikowany jak same funkcje Uśmiech.
Zapisane

Python 3.5.2 / Mint
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2017 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot