リストの平均を見つける


473

Pythonでリストの平均を見つけなければなりません。これはこれまでのところ私のコードです

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

私はそれを持っているので、リストの値を一緒に追加しますが、それらをそれらに分割する方法を知りませんか?


45
あなたがインストールnumpyの余裕があればnumpy.mean
ミッチ

7
sum(L) / float(len(L))。同様に、呼び出し元のコードで空のリストを扱うif not L: ...
n611x007

4
@mitch:numpyをインストールする余裕があるかどうかは問題ではありません。numpyはそれ自体が単語です。それは実際にnumpyが必要かどうかです。16mb Cの拡張機能であるnumpyをインストールして平均を計算することは、他の目的で使用しない人にとっては、非常に非現実的です。
n611x007 2015年

3
python 3を使用している場合は、avgy / meanのnumpyパッケージ全体をインストールする代わりに、「from statistic import mean」によって統計モジュールを使用してこれを実行できます。または、Python 2.7以下の場合、統計モジュールはsrcからダウンロードできます。 hg.python.org/cpython/file/default/Lib/statistics.py doc:docs.python.org/dev/library/statistics.html および直接使用されます。
25mhz

回答:


568

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)

Python 2ではlen、float除算を取得するには、floatに変換する必要があります

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

使用する必要はありませんreduce。これは非常に遅く、Python 3で削除されました。


9
リストがintで構成されている場合、python 2での結果はintになります
ミッチ

それは最高です !ばかげた質問で申し訳ありませんが、私は本当にそれをどこでも見ました!どうもありがとうございます !
Carla Dessi、2012年

7
言ったように、私はこれが初めてで、ループや何かで数を数えるためにそれを作らなければならないだろうと思っていました、私は長さだけを使うことができるとは思いませんでした。これは..私は、Pythonでやった最初のものである
カーラDessi

2
合計がint / floatに収まらない大量の場合はどうなりますか?
Foo Barユーザー

5
@FooBarUser次に、k = 1.0 / len(l)を計算してから削減します。reduce(lambda x、y:x + y * k、l)
Arseniy 2014年

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

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. Amber O'Hearn

8
ああ、しかしnp.array(l).mean()であるずっと速いです。
L.アンバーオハーン2015

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

私mind.thereの...通常の状態での速度を気にする必要はありませ中
TYAN

230

統計モジュールがされてきたのpython 3.4に追加します。平均と呼ばれる平均を計算する機能があります。指定したリストの例は次のとおりです。

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

28
これは、Python 3.4以降で利用可能な標準ライブラリモジュールを採用しているため、最もエレガントな回答です。
Serge Stroobandt

4
そして、数値的に安定しています
Antti Haapala

また、ソリューションをstatistics.StatisticsError: mean requires at least one data pointよりわかりやすくするのではなく、誤って空のリストを渡すと、エラーが発生しやすくZeroDivisionError: division by zeroなりsum(x) / len(x)ます。
ボリス

45

reduce()Pythonが完全にcromulent sum()関数を持っているときに、なぜこれを使用するのですか?

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

float()Pythonに浮動小数点除算を強制するために必要です。)



1
float()Python 3では必要ありません
ボリス

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、分散、モード、調和平均、中央値など、あまりにも便利な他の方法もあります。


18

floatにキャストする代わりに、合計に0.0を追加できます。

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

10

sum(l) / float(len(l)) 正解ですが、完全を期すために、1回の削減で平均を計算できます。

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

これにより、わずかな丸めエラーが発生する可能性があることに注意してください。

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

これはおもしろいことだと思いますが、空のリストに対して0を返すのは最善の方法ではないかもしれません
Johan Lundberg

1
@JohanLundberg- reduce()空のリストに対してFalseを与える最後の引数として0をFalseに置き換えることができます。それ以外の場合は以前の平均になります。
Andrew Clark

@AndrewClarkなぜあなたは強制floatするのlenですか?
EndermanAPM 2017年

8

上記のオプションを使用してみましたが、うまくいきませんでした。これを試して:

from statistics import mean

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

print(n)
print(mean(n))

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

1
戻り値False(integerと同等0)は、このエラーを処理するために考えられる最悪の方法です。をキャッチし、ZeroDivisionErrorより良いものを上げる方が良いでしょう(おそらくValueError)。
キンドール

@kindallはどのようにValueError優れていZeroDivisionErrorますか?後者はより具体的であり、さらに、別のエラーを再スローするためだけに算術エラーをキャッチすることは少し不必要に思えます。
MatTheWhale 2018年

なぜならZeroDivisionError、計算がどのように行われているか(つまり、リストの長さによる除算が含まれている)を知っている場合にのみ役立つからです。それがわからない場合は、渡した値の問題が何であるかはわかりません。一方、新しい例外には、より具体的な情報を含めることができます。
キンダル

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)

ブラボー:私見、sum(l)/len(l)これは最もエレガントな答えです(Python 3で型変換を行う必要はありません)。
Fralau

4

平均(別名平均)以上のものを取得したい場合は、scipy statsをチェックしてください。

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、2013年

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 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.