2017-02-21 34 views
1

Я следующий список:Список манипуляция экстракту значения больше, чем текущие и остальные значения индекса

elev = [0.0, 632.8, 629.9, 626.5, 623.7, 620.7, 620.7, 607.4, 603.2, 602.0, 606.6, 613.2, 608.4, 599.7, 583.6]

В идеале это должно быть в порядке убывания, но 602.0 меньше, чем следующие 3 значений (606.6,613.2,608.4) и мне нужен счетчик этих значений каждый раз, когда возникает этот вопрос. Я пытаюсь вложенным для петель сосчитать эти значения со следующими:

l = len(et)  
for i in xrange(1,l-1,1): 
    for j in xrange(1,l-1,1): 
     if (et[i] < et[j]): 
      print et[i] 

Но вместо этого я получаю все значения больше, чем 602.0. Как ограничить цикл, чтобы считать только эти 3 значения? Оцените любые предложения.

+0

является первым элементом всегда равен нулю? – NinjaGaiden

+1

Ваша запись 607.4 не соответствует порядку (613.2 и 608.4 больше), поэтому в последовательности вы получаете довольно много инверсий. Как вы хотите считать инверсии? Для 607.4 после него есть 2 больших значения; для 603,2 - 3; для 602,0 - 3; для 606.6, есть 2. Итак, вы должны получить 10 подсчитанных (10 значений напечатаны)? –

+0

Я хочу сохранить последовательность. Только хотите отслеживать инверсию, которая сначала соответствует критериям 'et [i] Ibe

ответ

1
l_elev = len(elev) 
gt_cnt = 0 
eq_cnt = 0 
slp_idx = [] 
for i in xrange(1,l_elev-3,1): 
    # following will take care of greater than current value inversion 
    if elev[i+gt_cnt] < elev[i+1+gt_cnt]: 
     lnew = elev[i+gt_cnt:] 
     gt_inv = [y for y in lnew if y >= elev[i+gt_cnt]] 
     gt_cnt += 1 
     for x in xrange(i,i+len(gt_inv),1): 
      slp_idx.append(x) 

    # following will take care of adjacent equal values 
    if (elev[i+eq_cnt] - elev[i+eq_cnt+1]) == 0: 
     cnew = elev[i:] 
     eq_inv = [y for y in cnew if y == elev[i+eq_cnt]] 
     eq_cnt+=1 
     for y in xrange(i,i+len(eq_inv),1): 
      slp_idx.append(y) 
    # break loop to avoid out of index error 
    if i+gt_cnt > l_elev: 
     break 
+0

подтвердил свой ответ и вопрос. вы можете сделать то же самое для моего ответа, пожалуйста. –

1

Я думаю, что это решит вашу проблему:

l = len(et)  
for i in xrange(1,l-1,1): 
    if et[i] < et[i+1]: 
     for j in xrange(i,l-1,1): 
      if (et[i] < et[j]): 
       print et[j] 

Это напечатает значения больше, чем ваш номер, не все, а только те, которые пришли после номера.

Это то, что я получил от моего терминала:

>>> for i in xrange(1,l-1,1): 
...  if et[i] < et[i+1]: 
...    print "for",et[i] 
...    for j in xrange(i,l-1,1): 
...      if (et[i] < et[j]): 
...        print et[j] 
... 
for 602.0 
606.6 
613.2 
608.4 
for 606.6 
613.2 
608.4 
+0

счет будет меняться, если я использую другой список, поэтому использование 'count <3' не является жизнеспособным – Ibe

+0

Я думаю, вам нужно запустить второй цикл из i, тогда проверьте ответ. –

+0

, он дает все большие значения, вместо этого мне нужны только те, которые больше, чем текущие и оставшиеся значения индекса. – Ibe