किसी सूची का औसत ज्ञात करना


473

मुझे पायथन में एक सूची का औसत ढूंढना है। यह मेरा अब तक का कोड है

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

मुझे यह मिल गया है इसलिए यह सूची में मूल्यों को एक साथ जोड़ता है, लेकिन मुझे नहीं पता कि इसे कैसे विभाजित किया जाए?


45
numpy.mean यदि आप
मिच

7
sum(L) / float(len(L))। कॉलर कोड में खाली सूचियों को if not L: ...
संभालें

4
@ मिच: यह कोई बात नहीं है कि क्या आप सुन्न स्थापित कर सकते हैं। numpy अपने आप में एक संपूर्ण शब्द है। यह है कि क्या आप वास्तव में सुन्न की जरूरत है। सुन्न स्थापित करना, एक 16mb सी एक्सटेंशन, मतलब गणना के लिए, अच्छी तरह से बहुत अव्यावहारिक होगा, किसी के लिए यह अन्य चीजों का उपयोग नहीं करेगा।
n611x007

3
केवल एवी / मीन के लिए पूरे संख्यात्मक पैकेज को स्थापित करने के बजाय अगर अजगर 3 का उपयोग कर रहे हैं, तो हम "सांख्यिकीय आयात माध्य से" या केवल पाइथन 2.7 या उससे कम पर आँकड़ा मॉड्यूल का उपयोग करके इस चीज़ को प्राप्त कर सकते हैं, सांख्यिकीय मॉड्यूल src से डाउनलोड किया जा सकता है: hg.python.org/cpython/file/default/Lib/statistics.py डॉक: docs.python.org/dev/library/statistics.html और सीधे इस्तेमाल किया।
25mhz

जवाबों:


567

पायथन 3.4+ पर आप उपयोग कर सकते हैं statistics.mean()

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

import statistics
statistics.mean(l)  # 20.11111111111111

पायथन के पुराने संस्करणों पर आप कर सकते हैं

sum(l) / len(l)

पायथन 2 पर आपको lenफ्लोट डिवीजन प्राप्त करने के लिए फ्लोट में बदलने की आवश्यकता होती है

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

उपयोग करने की कोई आवश्यकता नहीं है reduce। यह बहुत धीमा है और पायथन 3 में हटा दिया गया था ।


9
यदि सूची किलों से बनी है, तो अजगर 2 के तहत परिणाम एक इंट
मिच

यह बिल्कुल सही है ! बेवकूफ सवाल के लिए खेद है, लेकिन मैं वास्तव में उसके लिए हर जगह देखा है! आपको बहुत - बहुत धन्यवाद !
कार्ला देसी

7
जैसा कि मैंने कहा, मैं यह करने के लिए नया हूं, मैं सोच रहा था कि मुझे इसे लूप या कुछ के साथ बनाना होगा, इसमें संख्याओं की संख्या की गणना करने के लिए, मुझे एहसास नहीं था कि मैं सिर्फ लंबाई का उपयोग कर सकता हूं। यह पहली चीज है जो मैंने अजगर के साथ की है ..
कार्ला देसी

2
क्या होगा यदि योग एक विशाल संख्या है जो अभ्यस्त / फ्लोट में फिट नहीं होगी?
फू बार यूजर

5
@FooBarUser तब आपको kc = 1.0 / len (l), और फिर कम करना चाहिए: कम करना (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'१२ को

12
माना। floatबदसूरत नरक के रूप में है, बस इसे सरल रखना चाहता था।
येरपेज़ २ y

39
उस 'बदसूरत' फ्लोट को खत्म करने का दूसरा तरीका:sum(l, 0.0) / len(l)
रीमोसु

26
सी ++ प्रोग्रामर के रूप में, जो कि नरक के रूप में साफ-सुथरा है और फ्लोट बिल्कुल भी बदसूरत नहीं है!
लहजोन_ज

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 बार तैरने की एक यादृच्छिक सूची पर 8 बार लगता हैsum(l)/len(l)
एल। एम्बर ओ'हर्ने

8
ओह, लेकिन np.array(l).mean()है बहुत तेजी से।
एल। एम्बर ओ'हर्ेन

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
अकवल

11
ठीक है, जब तक कि यह केवल एक ही कारण नहीं है। मतलब गणना के लिए जो भी प्रसिद्धि है उसका 16mb C पैकेज स्थापित करना इस पैमाने पर बहुत अजीब लगता है।
n611x007

लेकिन मेरे दिमाग में। सामान्य स्थिति में गति के बारे में ध्यान रखने की जरूरत नहीं है ..
tyan

230

अजगर 3.4 में एक सांख्यिकी मॉड्यूल जोड़ा गया है । यह औसत नामक औसत की गणना करने के लिए एक फ़ंक्शन है । आपके द्वारा दी गई सूची के साथ एक उदाहरण होगा:

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

28
यह सबसे सुरुचिपूर्ण उत्तर है क्योंकि यह एक मानक पुस्तकालय मॉड्यूल को रोजगार देता है जो कि अजगर 3.4 के बाद से उपलब्ध है।
सर्ज स्ट्रोबंड्ट

4
और यह संख्यात्मक रूप से हकलाने वाला है
एंटी हापाला

और यह एक अच्छाई त्रुटि पैदा करता है यदि आप गलती से समाधान के लिए statistics.StatisticsError: mean requires at least one data pointएक अधिक गुप्त के बजाय एक खाली सूची में गुजरते हैं। ZeroDivisionError: division by zerosum(x) / len(x)
बोरिस

45

reduce()जब पायथन का पूर्ण रूप से क्रुमुलेंट sum()फ़ंक्शन होता है, तो आप इसके लिए उपयोग क्यों करेंगे ?

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

( float()फ्लोटिंग-पॉइंट डिवीजन करने के लिए पायथन को बाध्य करना आवश्यक है।)


34
हम में से उन लोगों के लिए जो '
क्रॉमुलेंट

1
float()पाइथन 3 पर आवश्यक नहीं है।
बोरिस

36

यदि आप अजगर> = 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 आदि जो बहुत उपयोगी हैं।



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 - आप अंतिम तर्क के रूप में 0 को गलत के साथ बदल सकते हैं reduce()जो आपको खाली सूची के लिए गलत देगा, अन्यथा पहले की तरह औसत।
एंड्रयू क्लार्क

@AndrewClark आप floatपर बल क्यों डालते हैं len?
एंडरमैनएपीएम

8

मैंने ऊपर दिए विकल्पों का उपयोग करने की कोशिश की, लेकिन काम नहीं किया। इसे इस्तेमाल करे:

from statistics import mean

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

print(n)
print(mean(n))

अजगर 3.5 पर काम किया


6

या उपयोग pandasकी Series.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(पूर्णांक के बराबर 0) इस त्रुटि को संभालने के लिए सबसे खराब संभव तरीका है। बेहतर पकड़ने के लिए ZeroDivisionErrorऔर कुछ बेहतर (शायद ValueError) बढ़ाने के लिए ।
kindall

@ मानव एक ValueErrorसे बेहतर कैसे है ZeroDivisionError? उत्तरार्द्ध अधिक विशिष्ट है, साथ ही यह एक अलग को फिर से फेंकने के लिए केवल एक अंकगणितीय त्रुटि को पकड़ने के लिए थोड़ा अनावश्यक लगता है।
MatTheWhale

क्योंकि 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)

ब्रावो: IMHO, sum(l)/len(l)अब तक का सबसे सुरुचिपूर्ण उत्तर है (पायथन 3 में टाइप रूपांतरण करने की आवश्यकता नहीं है)।
फ्रालौ

4

यदि आप केवल औसत (उर्फ औसत) से अधिक प्राप्त करना चाहते थे, तो आप डरावने आँकड़े देख सकते हैं

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
दिलचस्प है, लेकिन यह वह नहीं है जो उसने पूछा।
जोहान लुंडबर्ग

3

दोनों आपको पूर्णांक या कम से कम 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

@ और क्लार्क अपने बयान पर सही थे।


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यदि आप meanप्रत्येक पंक्ति को प्राप्त करने की आवश्यकता है, तो आप देख सकते हैं कि आयाम 3 * 10 है

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
अक्षम। यह सभी तत्वों को जोड़ने से पहले फ्लोट में परिवर्तित करता है। यह केवल लंबाई में परिवर्तित करने के लिए तेज़ है।
क्रिस कॉस्टन

1

सूची में औसत खोजें निम्नलिखित पायथन कोड का उपयोग करके :

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

उपरोक्त उत्तरों में से कुछ को मिलाकर, मैं निम्नलिखित के साथ आया हूं जो कम करने के साथ काम करता है और यह नहीं मानता है कि आपने 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)

क्या होगा यदि उपयोगकर्ता आपके सरणी में फ़्लोटिंग पॉइंट नंबर जोड़ता है? परिणाम सुपर imprecise होगा।
Flame_Phoenix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.