2015-04-29 2 views
1

Я пытаюсь перебрать arraylist, сохраняя в каждом цикле наивысшую/самую низкую разницу между последовательными значениями.Итерация через arraylist вычисление разности последовательных значений в python

e1=([ 0 , 0, 0, 0, 15, 28, 28, 28, 27, 27, 35, 44, 43, 43, 42, 39]) 
Hodiffmax = 0 
Hodiffmin = 0 
for k in e1: 
    diff1= e1[k+1] - e1[k] 
    if diff1 > Hodiffmax: 
     Hodiffmax=diff1 
    if diff1 < Hodiffmin: 
     Hodiffmin=diff1 

Проблема в том, что я получаю сообщение об ошибке «index out of bound». Как я могу итерации через arraylist с [k + 1]? Я попробовал кучу вещей, но я не умнее. Я ценю любую помощь!

EDIT (который не работает ни):

for k in e1: 
    for w in k: 
     diff1= e1[w+1] - e1[w] 
     if diff1 > Hodiffmax: 
      Hodiffmax=diff1 
     if diff1 < Hodiffmin: 
      Hodiffmin=diff1 

Ошибка: для ш в к - TypeError: объект '' numpy.int32 не итерацию

+1

использовать вложенные петли для – sheshadri

+0

вы имеете в виду в петле, например: для ш в к: (restcode) ... потому что не работал ни, в результате чего «не Iterable» ошибка – Baff

+0

Прочтите этот учебник http://www.tutorialspoint.com/python/python_nested_loops.htm, вы получите решение .. – sheshadri

ответ

2

Используйте grouper recipe:

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

from itertools import izip_longest # required by grouper 
i = [0, 0, 0, 0, 15, 28, 28, 28, 27, 27, 35, 44, 43, 43, 42, 39] 
lowest = None 
highest = None 
for z,q in grouper(i, 2): 
    v = z-q 
    if v < lowest: 
     lowest = v 
    if v > highest: 
     highest = v 
print(lowest) 
print(highest) 
+0

Спасибо, это работает! – Baff

3

С [y - x for x, y in zip(e1, e1[1:])] вы можете получить последовательные разницы, не беспокоясь за индексы:

>>> e1 = [ 0 , 0, 0, 0, 15, 28, 28, 28, 27, 27, 35, 44, 43, 43, 42, 39] 
>>> l = [y - x for x, y in zip(e1, e1[1:])] 
>>> Hodiffmax, Hodiffmin = max(l), min(l) 
>>> Hodiffmax, Hodiffmin 
15, -3 
0

Проблема в том, что вы выполняете итерации по элементам списка. Делая

for k in e1:

k будет получать значения элементов на e1. k=0, k=0, k=0, k=0, k=15, k=28 и так далее. Вместо этого вы должны перебирать диапазон списка.

for k in range(len(e1)): 

k будет получать значения индексов на e1. k=0, k=1, k=2, k=3, k=4, k=5 и так далее. Я думаю, что вы искали что-то вроде этого:

e1 = [0, 0, 0, 0, 15, 28, 28, 28, 27, 27, 35, 44, 43, 43, 42, 39] 

for k in range(len(e1)): 
    print k 
    if k > 0: 
    diff1 = e1[k] - e1[k-1] 
    if diff1 > Hodiffmax: 
     Hodiffmax=diff1 
    if diff1 < Hodiffmin: 
     Hodiffmin=diff1 

print 'Hodiffmax ' + str(Hodiffmax) 
print 'Hodiffmin ' + str(Hodiffmin) 
Смежные вопросы