Trovare la media di un elenco


473

Devo trovare la media di un elenco in Python. Questo è il mio codice finora

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print reduce(lambda x, y: x + y, l)

Ce l'ho, quindi aggiunge i valori nell'elenco, ma non so come dividerli in essi?


45
numpy.mean se puoi permetterti di installare numpy
mitch

7
sum(L) / float(len(L)). gestire elenchi vuoti nel codice chiamante comeif not L: ...
n611x007

4
@mitch: non è una questione se puoi permetterti di installare numpy. intorpidimento è una parola intera in sé. È se hai davvero bisogno di intorpidimento. Installare numpy, un'estensione di 16 MB, per il calcolo medio sarebbe, beh, molto poco pratico, per qualcuno che non lo usa per altre cose.
n611x007,

3
invece di installare l'intero pacchetto numpy per solo avg / mean se usando python 3 possiamo fare questo usando il modulo statistico semplicemente "da statistic import mean" o se su python 2.7 o meno, il modulo statistico può essere scaricato da src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html e usato direttamente.
25mhz,

Risposte:


568

Su Python 3.4+ puoi usare statistics.mean()

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

import statistics
statistics.mean(l)  # 20.11111111111111

Nelle versioni precedenti di Python puoi farlo

sum(l) / len(l)

Su Python 2 devi convertire lenin float per ottenere la divisione float

sum(l) / float(len(l))

Non v'è alcuna necessità di utilizzare reduce. È molto più lento ed è stato rimosso in Python 3.


9
se la lista è composta da ints, il risultato in python 2 sarà un int
mitch

È perfetto ! scusate la domanda stupida, ma ho cercato sinceramente ovunque! grazie mille !
Carla Dessi,

7
come ho detto, sono nuovo in questo, stavo pensando che avrei dovuto farlo con un ciclo o qualcosa per contare la quantità di numeri in esso, non mi rendevo conto che avrei potuto usare solo la lunghezza. questa è la prima cosa che ho fatto con Python ..
Carla Dessi il

2
cosa succede se la somma è un numero enorme che non si adatta a int / float?
Utente Foo Bar,

5
@FooBarUser quindi dovresti calcolare k = 1.0 / len (l), e quindi ridurre: riduci (lambda x, y: x + y * k, l)
Arseniy

519
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)

63
Se lo usi from __future__ import division, puoi eliminare quello brutto float.
S. Lott,

12
Concordato. floatè brutto da morire, volevo solo renderlo più semplice.
yprez,

39
Un altro modo per eliminare quel "brutto" galleggiante:sum(l, 0.0) / len(l)
remosu,

26
Come programmatore C ++, è pulito come l'inferno e float non è affatto brutto!
lahjaton_j,

20
In python3, puoi semplicemente usaresum(l) / len(l)
VasiliNovikov

283

Puoi usare numpy.mean:

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

import numpy as np
print(np.mean(l))

4
È strano. Avrei supposto che questo sarebbe molto più efficiente, ma sembra impiegare 8 volte più a lungo in un elenco casuale di galleggianti che semplicementesum(l)/len(l)
L. Amber O'Hearn,

8
Oh, ma np.array(l).mean()è molto più veloce.
L. Amber O'Hearn,

8
@ L.AmberO'Hearn, l'ho appena cronometrato np.mean(l)e np.array(l).meansono quasi alla stessa velocità, ed sum(l)/len(l)è circa due volte più veloce. Ho usato l = list(np.random.rand(1000)), ovviamente entrambi i numpymetodi diventano molto più veloci se lo lsono numpy.array.
Akavall,

11
bene, a meno che non sia l'unico motivo per installare numpy. l'installazione di un pacchetto da 16 MB di qualsiasi fama per il calcolo medio sembra molto strana su questa scala.
n611x007,

ma nella mia mente non c'è bisogno di preoccuparsi della velocità in condizioni normali ..
tyan

230

Un modulo statistico è stato aggiunto a Python 3.4 . Ha una funzione per calcolare la media chiamata media . Un esempio con l'elenco che hai fornito sarebbe:

from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)

28
Questa è la risposta più elegante perché impiega un modulo di libreria standard disponibile da Python 3.4.
Serge Stroobandt,

4
Ed è numericamente più stabile
Antti Haapala,

E produce un errore più bello se passi accidentalmente in un elenco vuoto statistics.StatisticsError: mean requires at least one data pointinvece di un più criptico ZeroDivisionError: division by zeroper la sum(x) / len(x)soluzione.
Boris,

45

Perché dovresti utilizzarlo reduce()quando Python ha una sum()funzione perfettamente cromulenta ?

print sum(l) / float(len(l))

( float()È necessario per forzare Python a fare una divisione in virgola mobile.)


34
Per quelli di noi che non conoscono
RolfBly,

1
float()non è necessario su Python 3.
Boris,

36

Esiste una libreria di statistiche se si utilizza python> = 3.4

https://docs.python.org/3/library/statistics.html

Puoi usare un metodo medio come questo. Supponiamo che tu abbia un elenco di numeri di cui vuoi trovare una media: -

list = [11, 13, 12, 15, 17]
import statistics as s
s.mean(list)

Ha anche altri metodi come stdev, varianza, modalità, media armonica, mediana ecc. Che sono troppo utili.


18

Invece di lanciare in float, puoi aggiungere 0,0 alla somma:

def avg(l):
    return sum(l, 0.0) / len(l)

10

sum(l) / float(len(l)) è la risposta giusta, ma solo per completezza è possibile calcolare una media con una sola riduzione:

>>> reduce(lambda x, y: x + y / float(len(l)), l, 0)
20.111111111111114

Si noti che ciò può comportare un leggero errore di arrotondamento:

>>> sum(l) / float(len(l))
20.111111111111111

Capisco che questo è solo per divertimento, ma restituire 0 per un elenco vuoto potrebbe non essere la cosa migliore da fare
Johan Lundberg,

1
@JohanLundberg - Potresti sostituire lo 0 con False come ultimo argomento a reduce()cui ti darebbe False per un elenco vuoto, altrimenti la media come prima.
Andrew Clark,

@AndrewClark perché si forza floatsu len?
EndermanAPM,

8

Ho provato a usare le opzioni sopra ma non ha funzionato. Prova questo:

from statistics import mean

n = [11, 13, 15, 17, 19]

print(n)
print(mean(n))

lavorato su Python 3.5


6

Oppure usa pandasil Series.meanmetodo:

pd.Series(sequence).mean()

demo:

>>> import pandas as pd
>>> l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
>>> pd.Series(l).mean()
20.11111111111111
>>> 

Dai documenti:

Series.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

Ed ecco i documenti per questo:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html

E l'intera documentazione:

https://pandas.pydata.org/pandas-docs/stable/10min.html


Questa non è una domanda da panda, quindi sembra eccessivo importare una libreria così pesante per un'operazione semplice come trovare la media.
cs95,

4

Avevo una domanda simile da risolvere nei problemi di Udacity. Invece di una funzione integrata ho codificato:

def list_mean(n):

    summing = float(sum(n))
    count = float(len(n))
    if n == []:
        return False
    return float(summing/count)

Molto più lungo del solito, ma per un principiante è piuttosto impegnativo.


1
Buona. Ogni altra risposta non ha notato il pericolo dell'elenco vuoto!
wsysuper,

1
Il ritorno False(equivalente all'intero 0) è il modo peggiore per gestire questo errore. Meglio catturare ZeroDivisionErrore sollevare qualcosa di meglio (forse ValueError).
kindall

@kindall come è ValueErrormeglio di un ZeroDivisionError? Quest'ultimo è più specifico, inoltre sembra un po 'inutile rilevare un errore aritmetico solo per lanciarne uno diverso.
MatTheWhale

Perché ZeroDivisionErrorè utile solo se sai come viene fatto il calcolo (cioè che è coinvolta una divisione per la lunghezza della lista). Se non lo sai, non ti dice quale sia il problema con il valore che hai passato. Considerando che la tua nuova eccezione può includere informazioni più specifiche.
kindall

4

come principiante, ho appena codificato questo:

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)

Bravo: IMHO, sum(l)/len(l)è di gran lunga la risposta più elegante (non è necessario effettuare conversioni di tipo in Python 3).
fralau,

4

Se volessi ottenere qualcosa in più della media (alias media) potresti dare un'occhiata alle statistiche di Scipy

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)

3

Per poter utilizzare la reducemedia corrente, è necessario tenere traccia del totale ma anche del numero totale di elementi visti finora. poiché questo non è un elemento banale nell'elenco, dovrai anche passare reduceun argomento in più in cui piegare.

>>> 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

1
interessante ma non è quello che ha chiesto.
Johan Lundberg,

3

Entrambi possono darti vicino a valori simili su un numero intero o almeno 10 valori decimali. Ma se stai davvero prendendo in considerazione valori variabili lunghi entrambi possono essere diversi. L'approccio può variare in base a ciò che si desidera ottenere.

>>> 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

Valori fluttuanti

>>> print reduce(lambda x, y: x + y, l) / float(len(l))
20.1111111111
>>> print sum(l)/float(len(l))
20.1111111111

@Andrew Clark aveva ragione sulla sua dichiarazione.


3

supporre che

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]]

puoi notare che xha dimensione 3 * 10 se hai bisogno di ottenere meanper ogni riga puoi digitare questo

theMean = np.mean(x1,axis=1)

non dimenticare di import numpy as np


1
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

l = map(float,l)
print '%.2f' %(sum(l)/len(l))

3
Inefficiente. Converte tutti gli elementi in float prima di aggiungerli. È più veloce convertire solo la lunghezza.
Chris Koston,

1

Trova la media nella lista usando il seguente codice PYTHON :

l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
print(sum(l)//len(l))

prova questo facile.


0
print reduce(lambda x, y: x + y, l)/(len(l)*1.0)

o come pubblicato in precedenza

sum(l)/(len(l)*1.0)

1.0 è per assicurarsi di ottenere una divisione in virgola mobile


0

Combinando un paio di risposte sopra, ho escogitato quanto segue che funziona con la riduzione e non presume che tu abbia a Ldisposizione la funzione di riduzione:

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

0

Voglio aggiungere solo un altro approccio

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)

-5
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)

cosa succede se l'utente aggiunge numeri in virgola mobile al proprio array? I risultati saranno super imprecisi.
Flame_Phoenix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.