Пошук середнього списку


473

Я маю знайти середній список у Python. Це мій код поки що

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
@mitch: справа не в тому, чи можна собі дозволити встановити numpy. numpy - це ціле слово саме по собі. Це, чи вам насправді потрібен нуд. Встановлення numpy, розширення на 16 М C, для середнього обчислення було б дуже непрактичним для тих, хто не використовує його для інших речей.
n611x007

3
замість встановлення всього пакету numpy для просто avg / mean, якщо за допомогою python 3 ми можемо це зробити за допомогою модуля статистики просто "зі статистичного середнього імпорту" або якщо на python 2.7 або менше, статистичний модуль можна завантажити з src: hg.python.org/cpython/file/default/Lib/statistics.py doc: docs.python.org/dev/library/statistics.html та безпосередньо використовується.
25мГц

Відповіді:


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)

На Python 2 вам потрібно перетворитись lenна float, щоб отримати поділ float

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

Не потрібно користуватися reduce. Це набагато повільніше і було видалено в Python 3.


9
якщо список складається з ints, результатом під python 2 буде int
mitch

Це ідеально ! вибачте за дурне запитання, але я справді всюди шукав цього! Дуже дякую !
Карла Дессі

7
як я вже сказав, я новачок у цьому, я думав, що мені доведеться зробити це за допомогою циклу або щось, щоб порахувати кількість чисел у ньому, я не зрозумів, що я можу просто використати довжину. це перше, що я зробив із
пітоном

2
що робити, якщо сума - це велика кількість, яка не вписується в int / float?
Користувач Foo Bar

5
@FooBarUser тоді слід обчислити k = 1,0 / len (l), а потім зменшити: зменшити (лямбда x, y: x + y * k, l)
Арсеній

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

26
Як програміст на C ++, це охайно, як пекло і пливе, зовсім не негарно!
lahjaton_j

20
У python3 ви можете просто скористатися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)
L. Amber O'Hearn

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.
Акавал

11
ну, якщо тільки це не є єдиною причиною встановлення нуме. встановлення пакету 16 Мб будь-якої слави для середнього розрахунку виглядає дуже дивним у цьому масштабі.
n611x007

але по-моєму. Тут не потрібно дбати про швидкість у нормальному стані ..
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.
Серж Стротобандт

4
І він чисельно стабільний
Антті Хаапала

І це призводить до помилки краще , якщо ви випадково пройти в порожньому списку statistics.StatisticsError: mean requires at least one data pointзамість більш загадкового ZeroDivisionError: division by zeroдля sum(x) / len(x)вирішення.
Борис

45

Навіщо використовувати reduce()для цього, коли Python має ідеально кромулентну sum()функцію?

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

( float()Потрібно змусити Python зробити поділ з плаваючою комою.)


34
Для тих із нас, що не знайомий
RolfBly

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, дисперсія, режим, середня гармоніка, медіана тощо, які занадто корисні.



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 на False як останній аргумент, reduce()який дасть вам False для порожнього списку, інакше середнього, як раніше.
Ендрю Кларк

@AndrewClark чому ви змушуєте floatна len?
EndermanAPM

8

Я спробував скористатися наведеними вище параметрами, але не вийшло. Спробуйте це:

from statistics import mean

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

print(n)
print(mean(n))

працював на python 3.5


6

Або ж за допомогою pandas«s 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

@kindall як 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)

Браво: IMHO - sum(l)/len(l)це, безумовно, найвишуканіша відповідь (не потрібно робити перетворення типів у Python 3).
fralau

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

@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
Неефективна. Він перетворює всі елементи на плаваючий елемент перед їх додаванням. Швидше перетворити лише довжину.
Кріс Костон

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

Поєднавши пару вищезазначених відповідей, я придумав наступне, що працює зі зменшенням і не передбачає, що у вас є 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.