2010-12-05 3 views
2

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

Прежде всего, мы находим среднее из двух элементов, три элемента ..... 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) 

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

ответ

2

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

Использование рекурсии было бы полезно здесь. Возвращайте единственный элемент, когда «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].

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

3

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

+0

, пожалуйста, не могли бы вы объяснить, что больше в более сопоставимом способе. – Bob 2010-12-05 08:36:19

+5

Сначала сделайте попытку, и мы проверим вас. – 2010-12-05 08:37:40

0

Это также возможность использовать питона 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] 
0

Сначала я дам вам объяснение, а затем некоторый псевдокод, который вам придется переписать на 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

Я изначально написал полный ответ, но подумал, что вы не узнаете об этом. Комментарий, который говорит «рассчитать средние значения в списке по индексам от 0 до длины - 2», - это заполнить. Если вы застряли, дайте мне знать, и я вам это посоветую. Удачи. – sprite 2010-12-05 08:59:13

Смежные вопросы