2014-10-01 4 views
0

привет я пытаюсь вычислить скорость роста в процентах из спискаРасчет скорости роста

def growth(): 

    population = [1, 3, 4, 7, 8, 12] 

    # new list for growth rates 
    growth_rate = [] 

    # for population in list 
    for pop in population: 

, но он дает мне ошибку индекса здесь (gnumbers) «IndexError, индекс находится вне диапазона»

 gnumbers = ((population[pop] - population[pop-1])/population[pop-1] * 100) 
     growth_rate.append(gnumbers) 
     print growth_rate 

growth() 
+1

Пожалуйста, разместите свои вопросы как минимальные, завершенные и проверенные примеры: http://stackoverflow.com/help/mcve С ними гораздо проще работать. – tom10

+0

Хорошо, конечно, помните об этом, но на мой вопрос не так уж плохо. –

+0

Этот вопрос не так уж плох, но ваш последний ужас. Вы получите лучшие ответы и, вероятно, выясните половину проблем на вашем пути, если вы опубликуете MCV. Кроме того, если вы публикуете MCV, люди, которые ответят, вероятно, будут запускать код, прежде чем отправлять свои ответы, что также будет лучше и меньше работы. – tom10

ответ

1

В вашем коде pop выполняет итерации по значениям из population, а не по индексам. Повторить по индексам (кроме нуля), пишет:

for pop in range(1, len(population)): 

Другой вещь, чтобы знать о том, что следующее использует целочисленное деление:

gnumbers = ((population[pop] - population[pop-1])/population[pop-1] * 100) 
               ^HERE 

Что это делает усечение результата целое число. Учитывая ваши данные, кажется довольно ясным, что вы этого не хотите. Вот один из способов перефразировать выражение, чтобы избежать этой проблемы:

gnumbers = ((population[pop] - population[pop-1]) * 100.0/population[pop-1]) 

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

+0

еще одна вещь, она дает мне весь список, но в форме парами. Вы знаете, что он печатает списки отдельно от начала для первого элемента, затем первого и второго и т. Д. Как я могу это исправить? –

+0

@TychoAtsma: вам нужно переместить 'print' из цикла. – NPE

0

Что NPE предлагает будет работать, я бы также предлагаю использовать перечисления, если вы хотите как индекс и значение списка:

for pop_index,pop_val in enumerate(population): 
+0

'enumerate()' отлично, но я не думаю, что это особенно хорошо подходит для этого варианта использования. – NPE

2

извините, не мог мой сам:

import numpy as np 

growth_rate = np.exp(np.diff(np.log(population))) - 1 
Смежные вопросы