从列表中删除不增加的连续元素,直到列表中的每个连续元素增加

时间:2018-06-27 18:28:30

标签: python loops

换句话说,我有一个列表元素(例如质量),应该随时间增加。这是一个示例列表:从最后一个元素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 :(得分:1)

一个问题:由于变量while(check==False):未更新,因此始终满足check。 Check仅具有值TrueFalse,并且不进行更新就不会改变,无论masst是什么样。 (再次查看代码,我不知道为什么当您只想要一个循环时同时使用forwhile循环。我认为您首先需要组织想法:)。)

答案 1 :(得分:1)

如果要从列表中移动非递减元素,请尝试以下操作:

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之前)。否则,我们继续前进。这将删除列表中所有小于其后元素的元素。