【问题标题】:removing non-increasing successive elements from list until each successive element in list is increasing从列表中删除非增加的连续元素,直到列表中的每个连续元素都增加
【发布时间】:2018-06-28 02:53:12
【问题描述】:

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

这样做,我似乎陷入了一个巨大的循环!我对自己的方法做错了什么感到有些困惑。

【问题讨论】:

    标签: python loops


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

    【讨论】:

      【解决方案2】:

      一个问题:while(check==False): 总是得到满足,因为变量 check 没有更新。检查只有值TrueFalse,如果不更新它,无论masst 看起来如何,它都不会改变。 (再次查看代码,我不知道为什么你只想要一个循环时同时使用forwhile 循环。我认为你需要先组织你的想法:)。)

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 2016-08-20
        相关资源
        最近更新 更多