একটি তালিকার গড় সন্ধান করা


473

পাইথনের একটি তালিকার গড় আমাকে খুঁজে পেতে হবে। এটি এখন পর্যন্ত আমার কোড

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

আমি পেয়েছি তাই এটি তালিকার মানগুলি একসাথে যুক্ত করে, তবে কীভাবে এগুলিতে বিভক্ত করা যায় তা আমি জানি না?


45
numpy.mean আপনি numpy ইনস্টল সামর্থ যদি
মিচ

7
sum(L) / float(len(L))। কলার কোডে খালি তালিকা হ্যান্ডেল করুনif not L: ...
n611x007

4
@ মিমিচ: আপনি নিম্পি ইনস্টল করতে পারবেন কিনা তা বিবেচ্য নয়। নিম্পি হ'ল একটি সম্পূর্ণ শব্দ। আপনার আসলে অদ্ভুত দরকার কিনা। নম্পি ইনস্টল করা, একটি 16 মিমি সেন্টিমিটার এক্সটেনশান, গড় গণনা করা ভাল, খুব অবাস্তব, কারও জন্য এটি অন্য জিনিসের জন্য ব্যবহার না করে।
n611x007

3
পাইথন 3 ব্যবহার করে আমরা পুরো গড়পড়তা প্যাকেজটি ইনস্টল করার পরিবর্তে স্ট্যাটিস্টিক মডিউলটি ব্যবহার করে এই কাজটি "স্ট্যাটিস্টিক ইমপোর্ট মেইন" থেকে করতে পারি অথবা পাইথন ২.7 বা তারও কম হলে, এসসিআরসি থেকে পরিসংখ্যান মডিউলটি ডাউনলোড করা যায়: hg.python.org/cpython/file/default/Lib/statistics.py ডক: ডকস.পিথন.আর.দেব / লাইব্রেরি / স্ট্যাটিসটিক্স 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
যদি তালিকাটি
অন্তর্নির্মিতভাবে

ঐটা নির্ভুল ! বোকা প্রশ্নের জন্য দুঃখিত, তবে আমি সত্যই এর জন্য সর্বত্র সন্ধান করেছি! তোমাকে অনেক ধন্যবাদ !
কারলা ডেসি

7
যেমনটি আমি বলেছিলাম, আমি এটিতে নতুন, আমি ভাবছিলাম যে এটির একটি লুপ বা এটির সাথে সংখ্যার পরিমাণ গণনা করার জন্য আমি এটি তৈরি করব, আমি বুঝতে পারি না যে আমি কেবল দৈর্ঘ্যটি ব্যবহার করতে পারি। অজগর দিয়ে আমি এই প্রথম কাজটি করেছি ..
কারলা ডেসি

2
যদি যোগফলটি একটি বিশাল সংখ্যা হয় যা পুরোপুরি / ফ্লোটে মানায় না?
ফু বার ব্যবহারকারী 0

5
@ ফুবারউসার এর পরে আপনার কে = 1.0 / লেন (এল) গণনা করা উচিত এবং তারপরে হ্রাস করুন: কমিয়ে দিন (ল্যাম্বডা এক্স, ওয়াই: এক্স + ওয়াই * কে, এল)
আর্সেনিয়

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

63
আপনি যদি ব্যবহার করেন তবে আপনি from __future__ import divisionসেই কুৎসিতটি দূর করতে পারেন float
এস্লট লট

12
একমত। floatজাহান্নামের মতো কুৎসিত, কেবল এটিকে আরও সহজ রাখতে চেয়েছিল।
yprez ২

39
এই 'কুরুচিপূর্ণ' ভাসমান অপসারণের আর একটি উপায়: sum(l, 0.0) / len(l)
অপসারণের

26
একজন সি ++ প্রোগ্রামার হিসাবে, এটি নরকের মতো ঝরঝরে এবং ভাসমানটি মোটেই কুৎসিত নয়!
লাহাজাটন_জে

20
অজগর 3 এ, আপনি কেবল ব্যবহার করতে পারেনsum(l) / len(l)
ভ্যাসিলিএনভিকভ

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)
এল। অ্যাম্বার ও'হের্ন

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
ভাল, যদি না নমাই ইনস্টল করার একমাত্র কারণ। গড় গণনার জন্য যে কোনও খ্যাতি রয়েছে তার 16 এমবি সি প্যাকেজ ইনস্টল করা এই স্কেলটিতে খুব অদ্ভুত দেখাচ্ছে।
n611x007

কিন্তু আমার mind.there স্বাভাবিক অবস্থায় গতি সম্পর্কে যত্ন প্রয়োজন না ..
tyan

230

পাইথন ৩.৪-তে একটি পরিসংখ্যান মডিউল যুক্ত করা হয়েছে । এটা তোলে গড় নামক গণনা করতে একটি ফাংশন আছে মানে । আপনার সরবরাহিত তালিকার একটি উদাহরণ হ'ল:

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

28
এটি সবচেয়ে মার্জিত উত্তর কারণ এটি একটি স্ট্যান্ডার্ড লাইব্রেরি মডিউল নিয়োগ করে যা পাইথন ৩.৪ থেকে পাওয়া যায়।
সার্জ Stroobandt

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()পাইথনকে একটি ভাসমান-পয়েন্ট বিভাগ করতে বাধ্য করা প্রয়োজন is)


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)

এটিতে অন্যান্য পদ্ধতি যেমন স্টাডিভ, ভেরিয়েন্স, মোড, সুরেলা গড়, মিডিয়ান ইত্যাদি রয়েছে যা খুব কার্যকর too



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
@ জোহানলুন্ডবার্গ - আপনি 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

উদাসীনতার সমস্যাগুলি সমাধান করার জন্য আমারও অনুরূপ প্রশ্ন ছিল। বিল্ট-ইন ফাংশনটির পরিবর্তে আমি কোড করেছিলাম:

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কেবলমাত্র কার্যকর যদি আপনি জানেন যে গণনাটি কীভাবে চলছে (যেমন, তালিকার দৈর্ঘ্যের দ্বারা একটি বিভাগ জড়িত)। আপনি যদি তা জানেন না, আপনি যে মানটি পাস করেছেন তাতে সমস্যাটি কী তা তা আপনাকে জানায় না Where
কান্ডল করুন

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)এখন পর্যন্ত সবচেয়ে মার্জিত উত্তর (পাইথন 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মাত্রা 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
অদক্ষ। এটি সমস্ত উপাদানগুলিকে যুক্ত করার আগে ভাসতে রূপান্তর করে। কেবল দৈর্ঘ্যে রূপান্তর করা এটি দ্রুত।
ক্রিস কোস্টন

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)

যদি ব্যবহারকারী আপনার অ্যারেতে ভাসমান পয়েন্ট সংখ্যা যুক্ত করে? ফলাফলগুলি অত্যন্ত অনর্থক হবে।
শিখা_ফিনিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.