Ik moet het gemiddelde van een lijst in Python vinden. Dit is mijn code tot nu toe
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)
Ik heb het zo dat het de waarden in de lijst bij elkaar optelt, maar ik weet niet hoe ik het erin moet verdelen?
Antwoord 1, autoriteit 100%
Op Python 3.4+ kun je statistics.mean()
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
import statistics
statistics.mean(l) # 20.11111111111111
Op oudere versies van Python kun je dat doen
sum(l) / len(l)
Op Python 2 moet je len
converteren naar een float om een float-deling te krijgen
sum(l) / float(len(l))
Het is niet nodig om reduce
te gebruiken. Het is veel langzamer en werd verwijderdin Python 3.
Antwoord 2, autoriteit 80%
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)
Antwoord 3, autoriteit 44%
Je kunt numpy.mean
:
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
import numpy as np
print(np.mean(l))
Antwoord 4, autoriteit 34%
Een statistieken-module is toegevoegd aan python 3.4. Het heeft een functie om het gemiddelde te berekenen, genaamd gemiddelde. Een voorbeeld van de lijst die u heeft opgegeven, is:
from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)
Antwoord 5, autoriteit 7%
Waarom zou je hiervoor reduce()
gebruiken als Python een perfect cromulente functie sum()
heeft?
print sum(l) / float(len(l))
(De float()
is nodig om Python te dwingen een deling met drijvende komma uit te voeren.)
Antwoord 6, autoriteit 5%
Er is een statistiekenbibliotheek als u python >= 3.4 gebruikt
https://docs.python.org/3/library/statistics.html
Je kunt zijn gemene methode op deze manier gebruiken. Laten we zeggen dat je een lijst hebt met getallen waarvan je het gemiddelde wilt vinden:-
list = [11, 13, 12, 15, 17]
import statistics as s
s.mean(list)
Het heeft ook andere methoden, zoals stdev, variantie, modus, harmonisch gemiddelde, mediaan, enz. die te nuttig zijn.
Antwoord 7, autoriteit 3%
In plaats van te casten om te zweven, kun je 0,0 bij de som optellen:
def avg(l):
return sum(l, 0.0) / len(l)
Antwoord 8
sum(l) / float(len(l))
is het juiste antwoord, maar voor de volledigheid kun je een gemiddelde berekenen met een enkele reductie:
>>> reduce(lambda x, y: x + y / float(len(l)), l, 0)
20.111111111111114
Merk op dat dit kan resulteren in een kleine afrondingsfout:
>>> sum(l) / float(len(l))
20.111111111111111
Antwoord 9
Ik heb geprobeerd de bovenstaande opties te gebruiken, maar werkte niet.
Probeer dit:
from statistics import mean
n = [11, 13, 15, 17, 19]
print(n)
print(mean(n))
werkte aan python 3.5
Antwoord 10
In termen van efficiëntie en snelheid zijn dit de resultaten die ik kreeg bij het testen van de andere antwoorden:
# test mean caculation
import timeit
import statistics
import numpy as np
from functools import reduce
import pandas as pd
LIST_RANGE = 10000000000
NUMBERS_OF_TIMES_TO_TEST = 10000
l = list(range(10))
def mean1():
return statistics.mean(l)
def mean2():
return sum(l) / len(l)
def mean3():
return np.mean(l)
def mean4():
return np.array(l).mean()
def mean5():
return reduce(lambda x, y: x + y / float(len(l)), l, 0)
def mean6():
return pd.Series(l).mean()
for func in [mean1, mean2, mean3, mean4, mean5, mean6]:
print(f"{func.__name__} took: ", timeit.timeit(stmt=func, number=NUMBERS_OF_TIMES_TO_TEST))
en de resultaten:
mean1 took: 0.17030245899968577
mean2 took: 0.002183011999932205
mean3 took: 0.09744236000005913
mean4 took: 0.07070840100004716
mean5 took: 0.022754742999950395
mean6 took: 1.6689282460001778
Zo duidelijk de winnaar is:
sum(l) / len(l)
11
Ik had een soortgelijke vraag om problemen op te lossen in de problemen van een Udacity. In plaats van een ingebouwde functie die ik heb gecodeerd:
def list_mean(n):
summing = float(sum(n))
count = float(len(n))
if n == []:
return False
return float(summing/count)
Veel langer dan normaal, maar voor een beginner zijn vrij uitdagend.
12
Als een beginner, heb ik dit gewoon gecodeerd:
L = [15, 18, 2, 36, 12, 78, 5, 6, 9]
total = 0
def average(numbers):
total = sum(numbers)
total = float(total)
return total / len(numbers)
print average(L)
13
Als u meer wilde krijgen dan alleen het gemiddelde (AKA-gemiddelde), kunt u scipy-statistieken controleren
from scipy import stats
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(stats.describe(l))
# DescribeResult(nobs=9, minmax=(2, 78), mean=20.11111111111111,
# variance=572.3611111111111, skewness=1.7791785448425341,
# kurtosis=1.9422716419666397)
14
Om reduce
voor het nemen van een hardingsgemiddelde, moet u het totaal bijhouden, maar ook het totale aantal elementen dat tot nu toe wordt gezien. Omdat dat geen triviaal element in de lijst staat, moet u ook doorgeven reduce
een extra argument om in te vouwen.
>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> running_average = reduce(lambda aggr, elem: (aggr[0] + elem, aggr[1]+1), l, (0.0,0))
>>> running_average[0]
(181.0, 9)
>>> running_average[0]/running_average[1]
20.111111111111111
15
Beide kunnen u in de buurt van vergelijkbare waarden geven op een geheel of ten minste 10 decimale waarden. Maar als u echt overweegt met lange drijvende waarden, kunnen beide verschillend zijn. Aanpak kan variëren op wat u wilt bereiken.
>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> print reduce(lambda x, y: x + y, l) / len(l)
20
>>> sum(l)/len(l)
20
Drijvende waarden
>>> print reduce(lambda x, y: x + y, l) / float(len(l))
20.1111111111
>>> print sum(l)/float(len(l))
20.1111111111
@Andrew Clark was correct op zijn verklaring.
16
Stel dat
x = [
[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03],
[-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33],
[-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]
]
U kunt opmerken dat x
dimensie 3 * 10 heeft als u de mean
naar elke rij moet krijgen, kunt u dit typen
theMean = np.mean(x1,axis=1)
Vergeet niet op import numpy as np
17
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
l = map(float,l)
print '%.2f' %(sum(l)/len(l))
18
Zoek het gemiddelde in de lijst
Door het volgende Python Code te gebruiken:
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(sum(l)//len(l))
Probeer dit eenvoudig.
19
print reduce(lambda x, y: x + y, l)/(len(l)*1.0)
of zoals eerder gepost
sum(l)/(len(l)*1.0)
De 1.0 is om ervoor te zorgen dat u een drijvende divisie krijgt
20
Combineren van een paar van de bovenstaande antwoorden, heb ik het volgende bedacht die werkt met het verminderen en neemt niet aan dat je L
beschikbaar hebt binnen de reducerende functie:
from operator import truediv
L = [15, 18, 2, 36, 12, 78, 5, 6, 9]
def sum_and_count(x, y):
try:
return (x[0] + y, x[1] + 1)
except TypeError:
return (x + y, 2)
truediv(*reduce(sum_and_count, L))
# prints
20.11111111111111
21
Ik wil gewoon een andere aanpak toevoegen
import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)
22
numbers = [0,1,2,3]
numbers[0] = input("Please enter a number")
numbers[1] = input("Please enter a second number")
numbers[2] = input("Please enter a third number")
numbers[3] = input("Please enter a fourth number")
print (numbers)
print ("Finding the Avarage")
avarage = int(numbers[0]) + int(numbers[1]) + int(numbers[2]) + int(numbers [3]) / 4
print (avarage)