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?


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

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.


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)

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

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)

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


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.


18

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

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

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

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


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


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.


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)

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)

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

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.


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


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

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

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.


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


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

0

Saya hanya ingin menambahkan pendekatan lain

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)

bagaimana jika pengguna menambahkan angka floating point ke array Anda? Hasilnya akan sangat tidak tepat.
Flame_Phoenix
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.