Bir listenin ortalamasını bulma


473

Python'da bir liste ortalamasını bulmak zorundayım. Bu benim kodum

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

Ben listedeki değerleri bir araya ekledi, ama ben onları bölmek nasıl bilmiyorum?


45
numpy.mean yükleme numpy yükleyebilirsiniz eğer
mitch

7
sum(L) / float(len(L)). Arayan kodundaki boş listeleri if not L: ...
yönetme

4
@mitch: numpy yüklemeyi göze alıp alamayacağınız meselesi değil. numpy başlı başına bir kelimedir. Gerçekten numpy'ye ihtiyacınız olup olmadığı. Ortalama hesaplamak için 16MB C uzantısı olan numpy'yi kurmak, başka şeyler için kullanmayan biri için çok pratik değildir.
n611x007

3
python 3 kullanıyorsanız tüm numpy paketini sadece avg / mean için yüklemek yerine, bu şeyi sadece "statistic import mean" ifadesinden istatistik modülü kullanarak veya python 2.7 veya daha azında istatistiksel modül src'den indirilebilir: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html ve doğrudan kullanılır.
25MHz

Yanıtlar:


567

Python 3.4+ sürümünde şunları kullanabilirsiniz: statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

Python'un eski sürümlerinde şunları yapabilirsiniz:

sum(l) / len(l)

Python 2'de lenşamandıra bölümü elde etmek için şamandıraya dönüştürmeniz gerekir

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

Kullanmaya gerek yoktur reduce. Çok daha yavaştır ve Python 3'te kaldırılmıştır .


9
Liste ints oluşan edilirse, piton 2 altında sonucunun int olacak
Mitch

Mükemmel ! aptalca soru için üzgünüm, ama bunun için gerçekten her yere baktım! çok teşekkür ederim !
Carla Dessi

7
Dediğim gibi, ben bu konuda yeniyim, ben bir döngü ya da bir şey ile sayıları saymak için bir şey yapmak zorunda olacağını düşünüyordum, ben sadece uzunluğu kullanabilirsiniz fark etmedi. bu python ile yaptığım ilk şey ..
Carla Dessi

2
toplam, int / float'a sığmayacak büyük bir sayı ise?
Foo Bar Kullanıcısı

5
@FooBarUser o zaman k = 1.0 / len (l) 'yi hesaplamalı ve azaltmalısınız: azaltın (lambda x, y: x + y * k, l)
Arseniy

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

63
Kullanırsanız from __future__ import division, bu çirkinliği ortadan kaldırabilirsiniz float.
S.Lott

12
Kabul. floatCehennem kadar çirkin, sadece daha basit tutmak istedim.
yprez

39
Bu 'çirkin' şamandırayı ortadan kaldırmanın başka bir yolu:sum(l, 0.0) / len(l)
remosu

26
Bir C ++ programcısı olarak, bu cehennem kadar temiz ve şamandıra hiç çirkin değil!
lahjaton_j

20
Python3, sadece kullanabilirsinizsum(l) / len(l)
VasiliNovikov

283

Şunları kullanabilirsiniz numpy.mean:

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

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

4
Bu garip. Bunun çok daha verimli olacağını varsaymıştım, ancak rastgele bir yüzen listede 8 kat daha uzun sürüyor gibi görünüyorsum(l)/len(l)
L. Amber O'Hearn

8
Oh, ama np.array(l).mean()bir çok daha hızlı.
L. Amber O'Hearn

8
@ L.AmberO'Hearn, sadece zaman aşımına ve np.mean(l)ve np.array(l).meanaynı hızda yaklaşık vardır ve sum(l)/len(l)iki kat hızlı hakkındadır. Ben kullanılan l = list(np.random.rand(1000))ders ikisi için, numpyyöntemler çok daha hızlı eğer haline lolduğunu numpy.array.
Akavall

11
iyi, sürece numpy yüklemek için tek nedeni. ortalama hesaplama için ne olursa olsun bir 16mb C paketi kurmak bu ölçekte çok garip görünüyor.
n611x007

ama aklımda. normal durumda hız umurumda değil ..
tyan

230

Python 3.4'e bir istatistik modülü eklendi . Ortalama olarak adlandırılan ortalamayı hesaplamak için bir işlevi vardır . Sağladığınız listeye örnek olarak şunlar verilebilir:

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

28
Bu en şık cevaptır, çünkü python 3.4'ten beri mevcut olan standart bir kütüphane modülü kullanır.
Serge Stroobandt

4
Ve sayısal olarak stabler
Antti Haapala

Ve çözüm için statistics.StatisticsError: mean requires at least one data pointdaha şifreli yerine yanlışlıkla boş bir listeye geçerseniz daha güzel bir hata üretir . ZeroDivisionError: division by zerosum(x) / len(x)
Boris

45

reduce()Python mükemmel bir karalama sum()işlevine sahip olduğunda neden bunu kullanasınız ?

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

( float()Python'u bir kayan nokta bölümü yapmaya zorlamak için gereklidir.)



1
float()Python 3'te gerekli değildir.
Boris

36

Python> = 3.4 kullanıyorsanız bir istatistik kütüphanesi var

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

Bunun gibi ortalama bir yöntem kullanabilirsiniz. Diyelim ki, bulmak istediğiniz sayıların bir listesi var: -

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

Stdev, varyans, mod, harmonik ortalama, medyan vb.Gibi çok yararlı olan başka yöntemleri de vardır.


18

Şamandıra dökmek yerine, toplama 0.0 ekleyebilirsiniz:

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

10

sum(l) / float(len(l)) doğru cevaptır, ancak tamlık için tek bir azaltmayla ortalama hesaplayabilirsiniz:

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

Bunun hafif bir yuvarlama hatasına neden olabileceğini unutmayın:

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

Bu sadece eğlence için olsun ama boş bir liste için 0 döndürme yapmak için en iyi şey olmayabilir
Johan Lundberg

1
@JohanLundberg - reduce()Boş bir liste için False verecek olan son argüman olarak 0 değerini False ile değiştirebilirsiniz , aksi takdirde önceki gibi ortalama.
Andrew Clark

@AndrewClark neden zorlamak floatüzerinde len?
EndermanAPM

8

Yukarıdaki seçenekleri kullanmayı denedim ama işe yaramadı. Bunu dene:

from statistics import mean

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

print(n)
print(mean(n))

python 3.5 üzerinde çalıştı


6

Ya kullanımı pandas'ın Series.meanyöntemi:

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

Dokümanlardan:

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

Ve işte bunun için dokümanlar:

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

Ve tüm belgeler:

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


Bu bir panda sorusu değil, bu yüzden ortalama bulmak gibi basit bir işlem için böyle ağır bir kütüphaneyi içe aktarmak aşırı görünüyor.
cs95

4

Udacity'nin sorunlarını çözmek için benzer bir sorum vardı. Kodlanmış yerleşik bir fonksiyon yerine:

def list_mean(n):

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

Normalden çok daha uzun ama yeni başlayanlar için oldukça zor.


1
İyi. Diğer her cevap boş liste tehlikesini fark etmedi!
wsysuper

1
Döndürme False(tamsayıya eşdeğer 0), bu hatayı işlemenin neredeyse en kötü yoludur. Yakalamak ZeroDivisionErrorve daha iyi bir şey yetiştirmek daha iyi (belki de ValueError).
16'da

@kindall nasıl ValueErrorbir daha iyidir ZeroDivisionError? İkincisi daha spesifiktir, ancak aritmetik bir hatayı sadece farklı bir hataya atmak için yakalamak gereksiz görünüyor.
MatTheWhale

Çünkü ZeroDivisionErrorsadece hesaplamanın nasıl yapıldığını biliyorsanız faydalıdır (yani, listenin uzunluğuna göre bölümleme söz konusudur). Bunu bilmiyorsanız, size ilettiğiniz değerle ilgili sorunun ne olduğunu söylemez. Oysa yeni istisnanız bu daha spesifik bilgileri içerebilir.
18'de

4

bir acemi olarak, ben sadece kodladı:

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)açık ara en şık cevap (Python 3'te tür dönüşümü yapmaya gerek yok).
fralau

4

Sadece ortalamadan (ortalama olarak) daha fazlasını elde etmek istiyorsanız, scipy istatistiklerini kontrol edebilirsiniz.

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

reduceÇalışan bir ortalama almak için kullanmak için, şimdiye kadar görülen toplamı değil toplam öğe sayısını da izlemeniz gerekir. Bu listede önemsiz bir öğe olmadığından, reducekatlanmak için ekstra bir argüman da iletmeniz gerekecek .

>>> 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
ilginç ama istediği bu değil.
Johan Lundberg

3

Her ikisi de size bir tamsayıda benzer değerlere yakın veya en az 10 ondalık değer verebilir. Ancak gerçekten uzun değişken değerleri düşünüyorsanız, her ikisi de farklı olabilir. Yaklaşım neyi başarmak istediğinize göre değişebilir.

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

Değişken değerler

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

@Andrew Clark yaptığı açıklamada haklıydı.


3

farz et ki

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

Eğer her satıra almanız xgerekiyorsa 3 * 10 boyutuna sahip olduğunu fark meanedebilirsiniz.

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

unutma 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
Yetersiz. Tüm öğeleri eklemeden önce yüzer hale getirir. Sadece uzunluğu dönüştürmek daha hızlıdır.
Chris Koston

1

Aşağıdaki PYTHON kodunu kullanarak listedeki ortalamayı bulun :

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

bunu kolay deneyin.


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

veya daha önce gönderilmiş gibi

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

1.0, kayan nokta bölümü aldığınızdan emin olmak içindir


0

Yukarıdaki cevaplardan birkaçını birleştirerek L, azaltma ile çalışan ve azaltma işlevi içinde kullanılabilir olduğunuzu varsaymayan aşağıdakileri buldum :

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

Sadece başka bir yaklaşım eklemek istiyorum

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)

kullanıcı dizinize kayan nokta sayıları eklerse ne olur? Sonuçlar çok kesin olmayacak.
Flame_Phoenix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.