Menemukan rata-rata daftar

473

Saya harus mencari rata-rata daftar di Python. Ini kode saya sejauh ini

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

Saya sudah mendapatkannya sehingga menambahkan nilai-nilai dalam daftar, tetapi saya tidak tahu bagaimana membuatnya membaginya?

Carla Dessi
sumber
45
numpy.berarti jika Anda mampu menginstal numpy
mitch
7
sum(L) / float(len(L)). menangani daftar kosong dalam kode pemanggil sepertiif not L: ...
n611x007
4
@itch: bukan masalah apakah Anda mampu menginstal numpy. numpy adalah keseluruhan kata itu sendiri. Apakah Anda benar-benar perlu numpy. Menginstal numpy, ekstensi 16mb C, untuk penghitungan rata-rata, tidak praktis untuk seseorang yang tidak menggunakannya untuk hal lain.
n611x007
3
daripada menginstal seluruh paket numpy hanya untuk rata-rata / rata-rata jika menggunakan python 3 kita bisa menyelesaikan ini dengan menggunakan modul statistik hanya dengan "dari statistik impor rata-rata" atau jika pada python 2.7 atau kurang, modul statistik dapat diunduh dari src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html dan langsung digunakan.
25mhz
2
Kemungkinan duplikat dari Menghitung rata-rata aritmatika (rata-rata) dengan Python
Pale Blue Dot

Jawaban:

568

Pada Python 3.4+ Anda dapat menggunakan statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

Pada versi Python yang lebih lama dapat Anda lakukan

sum(l) / len(l)

Pada Python 2 Anda perlu mengonversi lenke float untuk mendapatkan pembagian float

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

Tidak perlu digunakan reduce. Jauh lebih lambat dan dihapus dengan Python 3.

Herms
sumber
9
jika daftar ini terdiri dari int, hasilnya di bawah python 2 akan menjadi int
mitch
Itu sempurna ! maaf untuk pertanyaan bodoh, tapi aku benar-benar mencari kemana-mana untuk itu! Terima kasih banyak !
Carla Dessi
7
seperti yang saya katakan, saya baru dalam hal ini, saya berpikir saya harus membuatnya dengan loop atau sesuatu untuk menghitung jumlah angka di dalamnya, saya tidak menyadari bahwa saya hanya bisa menggunakan panjangnya. ini adalah hal pertama yang saya lakukan dengan python ..
Carla Dessi
2
bagaimana jika jumlahnya adalah angka besar yang tidak akan cocok dengan int / float?
Pengguna Foo Bar
5
@FooBarUser maka Anda harus menghitung k = 1.0 / len (l), dan kemudian mengurangi: mengurangi (lambda x, y: x + y * k, l)
Arseniy
519
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(l) / len(l)
yprez
sumber
63
Jika Anda menggunakan from __future__ import division, Anda bisa menghilangkannya float.
S.Lott
12
Sepakat. floatjelek sekali, hanya ingin membuatnya lebih sederhana.
yprez
39
Cara lain untuk menghilangkan float 'jelek' itu:sum(l, 0.0) / len(l)
remosu
26
Sebagai seorang programmer C ++, itu sangat rapi dan float tidak jelek sama sekali!
lahjaton_j
20
Dalam python3, Anda bisa menggunakansum(l) / len(l)
VasiliNovikov
283

Anda bisa menggunakan numpy.mean:

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

import numpy as np
print(np.mean(l))
Akavall
sumber
4
Itu aneh. Saya akan berasumsi ini akan jauh lebih efisien, tetapi tampaknya memakan waktu 8 kali lebih lama dari daftar acak mengapung daripada hanyasum(l)/len(l)
L. Amber O'Hearn
8
Oh, tapi np.array(l).mean()ini jauh lebih cepat.
L. Amber O'Hearn
8
@ L.AmberO'Hearn, saya hanya menghitung waktunya dan np.mean(l)dan np.array(l).meantentang kecepatan yang sama, dan sum(l)/len(l)sekitar dua kali lebih cepat. Aku digunakan l = list(np.random.rand(1000)), untuk kursus kedua numpymetode menjadi jauh lebih cepat jika lini numpy.array.
Akavall
11
baik, kecuali itu satu-satunya alasan untuk menginstal numpy. menginstal paket 16mb C dari ketenaran apa pun untuk penghitungan rata-rata terlihat sangat aneh pada skala ini.
n611x007
tetapi dalam pikiran saya. Tidak perlu peduli tentang kecepatan dalam kondisi normal ..
tyan
230

Sebuah statistik modul telah ditambahkan ke python 3.4 . Ini memiliki fungsi untuk menghitung rata-rata yang disebut rata- rata . Contoh dengan daftar yang Anda berikan adalah:

from statistics import mean
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]
mean(l)
Marwan Alsabbagh
sumber
28
Ini adalah jawaban yang paling elegan karena menggunakan modul library standar yang tersedia sejak python 3.4.
Serge Stroobandt
4
Dan secara numerik lebih stabil
Antti Haapala
Dan itu menghasilkan kesalahan yang lebih baik jika Anda secara tidak sengaja memasukkan daftar kosong statistics.StatisticsError: mean requires at least one data pointalih-alih lebih samar ZeroDivisionError: division by zerountuk sum(x) / len(x)solusinya.
Boris
45

Mengapa Anda menggunakan reduce()ini ketika Python memiliki cromulent yang sempurnasum() fungsi ?

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

(Hal float()ini diperlukan untuk memaksa Python melakukan pembagian floating-point.)

baik hati
sumber
34
Bagi kita yang baru mengenal
RolfBly
1
float()tidak diperlukan pada Python 3.
Boris
36

Ada perpustakaan statistik jika Anda menggunakan python> = 3.4

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

Anda dapat menggunakan metode rata-rata seperti ini. Katakanlah Anda memiliki daftar angka yang ingin Anda temukan rata-rata: -

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

Ini memiliki metode lain juga seperti stdev, varians, mode, rata-rata harmonik, median dll yang terlalu berguna.

Chetan Sharma
sumber
18

Alih-alih casting ke float, Anda dapat menambahkan 0,0 ke jumlah:

def avg(l):
    return sum(l, 0.0) / len(l)
Maxime Chéramy
sumber
10

sum(l) / float(len(l)) adalah jawaban yang tepat, tetapi hanya untuk kelengkapan Anda dapat menghitung rata-rata dengan satu pengurangan:

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

Perhatikan bahwa ini dapat menyebabkan sedikit kesalahan pembulatan:

>>> sum(l) / float(len(l))
20.111111111111111
Andrew Clark
sumber
Saya mengerti bahwa ini hanya untuk bersenang-senang tetapi mengembalikan 0 untuk daftar kosong mungkin bukan hal terbaik untuk dilakukan
Johan Lundberg
1
@JohanLundberg - Anda bisa mengganti 0 dengan False sebagai argumen terakhir reduce()yang akan memberi Anda False untuk daftar kosong, jika tidak rata-rata seperti sebelumnya.
Andrew Clark
@AndrewClark mengapa Anda memaksa floatpada len?
EndermanAPM
8

Saya mencoba menggunakan opsi di atas tetapi tidak berhasil. Coba ini:

from statistics import mean

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

print(n)
print(mean(n))

bekerja pada python 3.5

Ngury Mangueira
sumber
6

Atau penggunaan pandas's Series.meanmetode:

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

Dari dokumen:

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

Dan di sini adalah dokumen untuk ini:

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

Dan seluruh dokumentasi:

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

U10-Maju
sumber
Ini bukan pertanyaan panda, jadi sepertinya berlebihan untuk mengimpor perpustakaan yang sedemikian besar untuk operasi sederhana seperti menemukan mean.
cs95
4

Saya memiliki pertanyaan serupa untuk dipecahkan dalam masalah Udacity. Alih-alih fungsi bawaan yang saya kodekan:

def list_mean(n):

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

Jauh lebih lama dari biasanya tetapi bagi pemula itu cukup menantang.

Paulo YC
sumber
1
Baik. Setiap jawaban lain tidak memperhatikan bahaya daftar kosong!
wsysuper
1
Mengembalikan False(setara dengan bilangan bulat 0) hanyalah cara terburuk untuk menangani kesalahan ini. Lebih baik menangkap ZeroDivisionErrordan meningkatkan sesuatu yang lebih baik (mungkin ValueError).
kindall
@kindall bagaimana yang ValueErrorlebih baik dari pada ZeroDivisionError? Yang terakhir ini lebih spesifik, ditambah lagi sepertinya tidak perlu menangkap kesalahan aritmatika hanya untuk melemparkan kembali yang berbeda.
MatTheWhale
Karena ZeroDivisionErrorhanya berguna jika Anda tahu bagaimana perhitungan sedang dilakukan (yaitu, bahwa sebuah divisi pada panjang daftar terlibat). Jika Anda tidak tahu itu, itu tidak memberi tahu Anda apa masalahnya dengan nilai yang Anda berikan. Sedangkan pengecualian baru Anda dapat memasukkan informasi yang lebih spesifik.
hati
4

sebagai pemula, saya hanya memberi kode ini:

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)
AlmoDev
sumber
Bravo: IMHO, sum(l)/len(l)sejauh ini merupakan jawaban yang paling elegan (tidak perlu melakukan konversi jenis dengan Python 3).
fralau
4

Jika Anda ingin mendapatkan lebih dari sekadar rata-rata (alias rata-rata), Anda dapat memeriksa statistik yang tidak lengkap

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)
jasonleonhard
sumber
3

Agar dapat digunakan reduceuntuk mengambil rata-rata berlari, Anda harus melacak total tetapi juga jumlah elemen yang terlihat sejauh ini. karena itu bukan elemen sepele dalam daftar, Anda juga harus memberikan reduceargumen tambahan untuk dilipat.

>>> 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
SingleNegationElimination
sumber
1
menarik tapi bukan itu yang dia minta.
Johan Lundberg
3

Keduanya dapat memberi Anda mendekati nilai yang sama pada bilangan bulat atau setidaknya 10 nilai desimal. Tetapi jika Anda benar-benar mempertimbangkan nilai mengambang lama keduanya bisa berbeda. Pendekatan dapat bervariasi pada apa yang ingin Anda capai.

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

Nilai mengambang

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

@Andrew Clark benar dalam pernyataannya.

Superpaul
sumber
3

seandainya

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

Anda dapat melihat bahwa xmemiliki dimensi 3 * 10 jika Anda perlu mendapatkan meanuntuk setiap baris Anda dapat mengetik ini

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

jangan lupa import numpy as np

Mohamed A M-Hassan
sumber
1
l = [15, 18, 2, 36, 12, 78, 5, 6, 9]

l = map(float,l)
print '%.2f' %(sum(l)/len(l))
pengguna1871712
sumber
3
Tidak efisien Itu mengkonversi semua elemen untuk melayang sebelum menambahkannya. Lebih cepat mengonversi panjangnya saja.
Chris Koston
1

Temukan rata-rata dalam daftar Dengan menggunakan kode PYTHON berikut :

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

coba ini dengan mudah.

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

atau suka diposting sebelumnya

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

1.0 adalah untuk memastikan Anda mendapatkan divisi floating point

RussS
sumber
0

Menggabungkan beberapa jawaban di atas, saya telah datang dengan yang berikut ini yang berfungsi dengan mengurangi dan tidak menganggap Anda memiliki Ldi dalam fungsi pengurangan:

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
Ruben
sumber
0

Saya hanya ingin menambahkan pendekatan lain

import itertools,operator
list(itertools.accumulate(l,operator.add)).pop(-1) / len(l)
Taylan
sumber
-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)
Oscar Wade
sumber
bagaimana jika pengguna menambahkan angka floating point ke array Anda? Hasilnya akan sangat tidak tepat.
Flame_Phoenix