среднее значение списка в Python - PullRequest
2 голосов
/ 05 декабря 2010

У меня проблема: мне нужно найти среднее значение по списку, используя эту схему:

Прежде всего, мы находим среднее из двух элементов, трех элементов ..... len(list) элементов и формируем новый список, используя средние значения. Используйте .pop() и найдите все средние значения снова. Функция должна прекратиться, когда len(list) == 2. Следует использовать рекурсию.

Пример: список: [-1, 4, 8, 1]

1 шаг:

  • найти в среднем [-1, 4], [-1, 4, 8], [-1, 4, 8, 1]
  • Затем мы формируем новый список: [1.5, 3.66..., 3] (в среднем)
  • Затем найдите средние значения нового списка: [1.5, 3.66...], [1.5, 3.66..., 3]
  • Затем мы формируем новый список: [2.5833.., 7.222...] (в среднем)
  • Когда len(list) == 2, найдите среднее значение для этих двух элементов.

Ответ 2.652777.

Что мне написать:

jada = []

while True:    
    print 'Lst elements:'    
    a = input()
    if (a == ''):    
        break    
    jada.append(a)

print 'Lst is:' + str(Jada)

def keskmine(Jada):
    for i in range(len(Jada) - 1):
        ...

    jada.pop()
    return keskmine(Jada)

На самом деле, это часть домашней работы, но я не знаю, как ее решить.

Ответы [ 4 ]

3 голосов
/ 05 декабря 2010

Принять список в качестве аргумента функции.Если в списке есть один элемент, верните его.Создайте два итератора из списка.Выньте один элемент из одного из списков, скрепите их вместе, а затем найдите средние значения результатов.Recurse.

2 голосов
/ 05 декабря 2010

Короче говоря, вы находите "скользящее среднее" из списка чисел.

Здесь было бы полезно использовать рекурсию. Вернуть единственный элемент, когда "len (lst) == 1" в противном случае, вычислить скользящее среднее и рекурсировать.

В этом задании есть две части. Во-первых, вам нужно преобразовать списки типа [-1, 4, 8, 1] в списки типа [1.5, 3.66, 3] (найти скользящие средние). Во-вторых, вам нужно повторить этот процесс с результатами скользящих средних, пока длина вашего списка не станет 2 (или 1).

Вы можете решить первую проблему (найти скользящие средние значения) независимо от второй. Найти скользящее среднее очень просто, вы сначала отслеживаете промежуточную сумму (например, если список равен [-1, 4, 8, 1], промежуточная сумма равна [-1, 3, 11, 12]) и делите каждый элемент по их соответствующему рабочему индексу (т.е. просто [1, 2, 3, 4]), чтобы получить [-1/1, 3/2, 11/3, 12/4] = [-1, 1,5, 3,66, 3] , Затем вы можете отказаться от первого элемента, чтобы получить [1.5, 3.66, 3].

Вторая проблема может быть легко решена с помощью рекурсии. Рекурсия - это просто еще одна форма зацикливания, весь рекурсивный код может быть преобразован в обычный код for / while-loop, а весь код зацикливания может быть преобразован в рекурсивный код. Однако некоторые проблемы имеют тенденцию к более «естественному» решению либо в рекурсии, либо в цикле. На мой взгляд, вторая проблема (повторение процесса взятия средних значений) более естественно решается с помощью рекурсии. Предположим, что вы решили первую проблему (нахождения скользящего среднего), и у нас есть функция runavg (lst), чтобы решить первую проблему. Мы хотим написать функцию, которая многократно находит скользящее среднее lst, или возвращает среднее значение, когда длина lst равна 2.

0 голосов
/ 05 декабря 2010

Сначала я дам вам объяснение, а затем немного псевдокода, который вам придется переписать на Python. Основная идея состоит в том, чтобы иметь одну функцию, которая вызывает себя, передавая меньшую проблему с каждой итерацией. В этом случае вы хотели бы уменьшить количество предметов на 1.

Вы можете создавать новый список при каждом вызове или использовать один и тот же, если хотите. Прежде чем перейти к следующему итерации списка, вам необходимо рассчитать средние значения, тем самым создав более короткий список.

Идея состоит в том, что вы суммируете числа в параметре и делите их на количество элементов, которые вы добавили к соответствующему индексу в списке. Как только вы закончите, вы можете вытолкнуть последний элемент.

Код должен выглядеть примерно так: (индексы в выборке начинаются с нуля)

average(list[])
    if(list.length == 0)  // Check input and handle errors
        exit
    if(list.length == 1)  // Recursion should stop
        return list[0]    // The one item is it's own average!
    // calculate the averages into the list in indices 0 to length - 2
    list.pop()                       // remove the last value
    return average(list)             // the recursion happens here
0 голосов
/ 05 декабря 2010

Это также возможность использовать python 3.x itertools.accumulate :

Из документов:

>>> list(accumulate(8, 2, 50))

[8, 10, 60]

Затем вам нужно всего лишь разделить каждый элемент на его индекс, увеличенный на 1, исключить первый элемент и повторять до конца

Например, это работает для любого списка любой длины, выполняя большинство из указанных выше шагов внутри списка:

>>> from itertools import accumulate
>>> a = [-1, 4, 8, 1]
>>> while len(a) > 1:
    a = [item / (index + 1) for (index, item) in enumerate(accumulate(a)) if index > 0]

>>> print(a)
[2.6527777777777777]
...