удаление нерастущих последовательных элементов из списка, пока каждый последующий элемент в списке не увеличивается - PullRequest
0 голосов
/ 27 июня 2018

Другими словами, у меня есть элементы списка (например, масса), которые должны со временем увеличиваться. Вот пример списка: начиная с последнего элемента 179.2, каждый элемент после него должен увеличиваться. Мы видим, что это случаи, которым этот критерий не соответствует (после 278.8).

masst = [306.4, 303.7, 301.7, 301.7, 295.7, 293.9, 288.4, 225.9, 
         225.2, 278.7, 274.6, 272.9, 269.3, 269.8, 269.1, 271.1, 
         269.7, 266.9, 266.8, 192.8, 197.6, 196.1, 254.3, 249.6, 
         244.8, 243.4, 241.2, 237.6, 234.1, 229.8, 223.2, 217.8
         211.2, 207.5, 203.5, 199.2, 195.6, 191.7, 188.0, 179.2]

Хотя это пример, у меня есть фактические данные, что это случается, которые также различаются по длине. Поэтому в идеале я пытаюсь разрешить эти списки, просматривая каждый список, пока каждый элемент не увеличивается по сравнению с предыдущим элементом.

Я могу изменить порядок увеличения списка, пока фактический список не совпадет с перестроенным списком:

import numpy as np

check = masst == sorted(masst, reverse=True)
while(check==False):
    bool_ = [] # list of true and false statements
    for i in range(0, len(masst)-1):
        inc = masst[i] >= masst[i+1]
        bool_.append(inc)
    masst = list(np.array(masst)[bool_])

При этом кажется, что я застрял в гигантской петле! Я немного запутался в том, что я делаю неправильно с моим методом.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

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

i = 1
while i < len(masst):
    if masst[i] > masst[i-1]:
        del masst[i-1]
        i = i-1 or 1
    else:
        i += 1

Это начнется с индекса 1, и на каждой итерации будет проверяться число перед текущей. Если он ниже, он удаляет его, и тогда индекс текущего числа уменьшится на единицу, поэтому мы вернемся назад (но никогда до индекса 1). В противном случае мы продолжаем. Это удалит все элементы списка, которые меньше, чем элемент, следующий за ним.

0 голосов
/ 27 июня 2018

Одна проблема: while(check==False): всегда выполняется, поскольку переменная check не обновляется. Check просто имеет значение True или False, и без обновления оно не изменится независимо от того, как выглядит masst. (Снова просматривая код, я не знаю, почему вы используете и цикл for, и while, когда вам нужен только один цикл. Я думаю, что вам нужно сначала организовать свои идеи :).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...