목록의 평균 찾기


473

파이썬에서 평균 목록을 찾아야합니다. 이것은 지금까지 내 코드입니다

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

목록에 값을 합산하여 값을 나누는 방법을 모르겠습니다.


45
numpy를 설치할 여유가 있다면 numpy.mean
mitch

7
sum(L) / float(len(L)). 발신자 코드에서 빈 목록 처리if not L: ...
n611x007

4
@ mitch : numpy를 설치할 여유가 있는지 여부는 중요하지 않습니다. numpy는 그 자체로 전체 단어입니다. 실제로 numpy가 필요한지 여부입니다. 평균 계산을 위해 16mb C 확장 인 numpy를 설치하면 다른 용도로 사용하지 않는 사람에게는 매우 비실용적입니다.
n611x007

3
python 3을 사용하는 경우 평균 / 평균을 위해 전체 numpy 패키지를 설치하는 대신 "통계 가져 오기 평균에서"로 통계 모듈을 사용 하여이 작업을 수행 할 수 있거나 python 2.7 이하에서 통계 모듈을 src에서 다운로드 할 수 있습니다. hg.python.org/cpython/file/default/Lib/statistics.py 문서 : docs.python.org/dev/library/statistics.html 및 직접 사용됩니다.
25mhz

답변:


567

Python 3.4 이상에서는 다음을 사용할 수 있습니다 statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

이전 버전의 Python에서는 할 수 있습니다

sum(l) / len(l)

파이썬 2에서는 lenfloat 나누기를 얻기 위해 float 로 변환해야합니다

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

사용할 필요가 없습니다 reduce. 훨씬 느리고 Python 3에서 제거 되었습니다.


9
만약리스트가 정수로 구성된다면, 파이썬 2의 결과는 정수가 될 것입니다
mitch

저건 완벽 해 ! 바보 같은 질문에 대해 유감이지만, 나는 그것을 위해 모든 곳을 진정으로 찾았습니다! 정말 고맙습니다 !
칼라 데시

7
내가 말했듯이, 나는 이것에 익숙하지 않다. 나는 루프 또는 숫자로 셀 수를 계산하기 위해 무언가를 만들어야한다고 생각했다. 나는 단지 길이를 사용할 수 있다는 것을 몰랐다. 이것은 내가 파이썬으로 한 첫 번째 일입니다 ..
Carla Dessi

2
합계가 int / float에 맞지 않는 거대한 숫자라면?
Foo Bar 사용자

5
@FooBarUser 그런 다음 k = 1.0 / len (l)을 계산 한 다음 줄이십시오. reduce (lambda x, y : x + y * k, l)
Arseniy

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

63
당신이 사용하는 경우 from __future__ import division, 당신은 그 추악한 제거 할 수 있습니다 float.
S.Lott

12
동의했다. float못생긴 것처럼, 더 단순하게 유지하고 싶었습니다.
yprez

39
'못생긴'부유물을 제거하는 또 다른 방법 :sum(l, 0.0) / len(l)
remosu

26
C ++ 프로그래머로서, 그것은 지옥과 부유물처럼 깔끔하지 않습니다!
lahjaton_j

20
python3에서는 다음을 사용할 수 있습니다sum(l) / len(l)
VasiliNovikov

283

당신은 사용할 수 있습니다 numpy.mean:

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

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

4
이상하다. 나는이 훨씬 더 효율적이 될 것입니다 가정 한 것이지만, 단순히보다는 수레의 임의의 목록만큼 8 시간이 걸릴 것으로 보인다sum(l)/len(l)
L. 황색 오헌

8
아,하지만 np.array(l).mean()입니다 훨씬 더 빨리.
L. Amber O'Hearn

8
@ L.AmberO'Hearn, 난 그냥 시간 초과 np.mean(l)np.array(l).mean같은 속도에 대해, 그리고 sum(l)/len(l)배 빠른에 관한 것입니다. 내가 사용하는 l = list(np.random.rand(1000))과정 모두, numpy방법이 훨씬 빠른 경우가 될 l것입니다 numpy.array.
Akavall

11
그것이 numpy를 설치하는 유일한 이유가 아닌 한. 평균 계산에 대한 명성을 가진 16mb C 패키지를 설치하면이 규모에서 매우 이상하게 보입니다.
n611x007 12

그러나 내 마음에. 정상적인 상태에서 속도를 신경 쓸 필요가 없습니다.
tyan

230

통계 모듈은 한 파이썬 3.4에 첨가 . 평균이라는 평균 을 계산하는 기능이 있습니다. 제공 한 목록의 예는 다음과 같습니다.

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

28
이것은 파이썬 3.4부터 사용할 수있는 표준 라이브러리 모듈을 사용하기 때문에 가장 우아한 대답입니다.
Sroo Stroobandt 2016 년

4
그리고 그것은 수치 적으로 안정적입니다
Antti Haapala

실수로 빈 목록에 전달하면 그리고 그것은 더 좋은 오류가 발생합니다 statistics.StatisticsError: mean requires at least one data point대신 더 비밀 ZeroDivisionError: division by zero을위한 sum(x) / len(x)솔루션입니다.
보리스

45

reduce()파이썬이 완벽하게 cromulent sum()함수를 가질 때 왜 이것을 사용 하겠습니까?

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

( float()파이썬이 부동 소수점 나누기를하도록 강제해야한다.)



1
float()파이썬 3에서는 필요하지 않습니다.
Boris

36

python> = 3.4를 사용하는 경우 통계 라이브러리가 있습니다.

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

이런 방법으로 사용할 수 있습니다. 당신이 찾고 싶은 숫자의 목록이 있다고 가정 해 봅시다.

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

그것은 너무 유용한 stdev, variance, mode, harmonic mean, median 등과 같은 다른 방법을 가지고 있습니다.


18

캐스팅하여 플로팅하는 대신 합계에 0.0을 추가 할 수 있습니다.

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

10

sum(l) / float(len(l)) 정답이지만 완전성을 위해 단일 감소로 평균을 계산할 수 있습니다.

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

약간의 반올림 오류가 발생할 수 있습니다.

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

나는이 그냥 재미로하지만, 빈리스트 0을 반환하는 것은 할 수있는 최선의 일은하지 않을 수 있음을 얻을
요한 룬드

1
@JohanLundberg- reduce()빈 목록에 대해 False를 제공 하는 마지막 인수로 0을 False로 바꿀 수 있습니다. 그렇지 않으면 이전과 같은 평균입니다.
Andrew Clark

@AndrewClark 왜 강요하는 걸까 floatlen?
EndermanAPM

8

위의 옵션을 사용해 보았지만 작동하지 않았습니다. 이 시도:

from statistics import mean

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

print(n)
print(mean(n))

파이썬 3.5에서 일했습니다.


6

또는 pandasSeries.mean방법을 사용하십시오.

pd.Series(sequence).mean()

데모:

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

문서에서 :

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

그리고 이것에 대한 문서는 다음과 같습니다.

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

그리고 전체 문서 :

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


이것은 팬더 질문이 아니므로 평균을 찾는 것과 같은 간단한 작업을 위해 무거운 라이브러리를 가져 오는 것이 과도하게 보입니다.
cs95

4

나는 Udacity의 문제를 해결하기 위해 비슷한 질문을했습니다. 내장 함수 대신 내가 코딩했습니다 :

def list_mean(n):

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

평소보다 훨씬 길지만 초보자에게는 상당히 도전적입니다.


1
좋은. 다른 모든 답변은 빈 목록 위험을 인식하지 못했습니다!
wsysuper

1
False(integer와 동등)을 반환 하는 것은 0이 오류를 처리하는 가장 최악의 방법입니다. 더 잘 잡을 수 ZeroDivisionError있고 더 나은 물건을 키울 수 ValueError있습니다.
kindall

@kindall 어떻게 A ValueError보다 나은가 ZeroDivisionError? 후자는 더 구체적이며, 다른 오류를 다시 던지기 위해 산술 오류를 잡는 것이 약간 필요하지 않은 것 같습니다.
MatTheWhale

때문에 ZeroDivisionError당신이 계산이 (리스트의 길이에 의해 부서가 관련되어 있음을, 즉) 수행되는 방법을 알고있는 경우에만 유용합니다. 당신이 그것을 모른다면, 그것은 당신이 전달한 가치에 어떤 문제가 있는지 알려주지 않습니다. 반면에 새로운 예외는 더 구체적인 정보를 포함 할 수 있습니다.
kindall

4

초보자로서 방금 이것을 코딩했습니다.

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)는 가장 우아한 답변입니다 (Python 3에서는 유형 변환을 할 필요가 없습니다).
fralau

4

평균 (일명 평균) 이상을 얻으려면 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

reduce평균을 계산하는 데 사용하려면 지금까지 표시된 총 요소 수와 총 요소 수를 추적해야합니다. 그것이 목록의 사소한 요소가 아니기 때문에 reduce접을 수있는 추가 인수를 전달해야 합니다.

>>> 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
흥미롭지 만 그것은 그가 요구 한 것이 아닙니다.
Johan Lundberg

3

둘 다 정수 또는 10 이상의 10 진수 값에서 유사한 값에 근접 할 수 있습니다. 그러나 실제로 부동 부동 값을 고려하면 둘 다 다를 수 있습니다. 접근하려는 목표에 따라 다를 수 있습니다.

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

부동 값

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

@Andrew Clark는 그의 진술에 정확했습니다.


3

한다고 가정

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

당신은이 알 수있는 x당신이 얻을해야하는 경우 치수 3 * 10을 가지고 mean당신이 입력 할 수 있습니다 각 행

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

잊지 마세요 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
무능한. 추가하기 전에 모든 요소를 ​​부동으로 변환합니다. 길이 만 변환하는 것이 더 빠릅니다.
Chris Koston

1

다음 PYTHON 코드 를 사용하여 목록에서 평균을 찾으십시오 .

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

이것을 쉽게 시도하십시오.


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

또는 이전에 게시 된 것

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

1.0은 부동 소수점 나누기를 얻는 것입니다.


0

위의 두 가지 답변을 결합하여 reduce와 함께 작동하고 reduce L함수 내부에서 사용할 수 있다고 가정하지 않는 다음을 생각해 냈습니다 .

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

다른 접근법을 추가하고 싶습니다.

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)

사용자가 배열에 부동 소수점 숫자를 추가하면 어떻게됩니까? 결과는 매우 부정확합니다.
Flame_Phoenix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.