创建一个返回递增顺序的函数

时间:2018-11-11 16:14:39

标签: python list boolean func

我正在尝试创建一个函数,以整数序列作为数组可以确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。如果可以删除某个元素,则输出为True,否则返回False。我尝试过,

def almostIncreasingSequence(sequence):

   if sequence[:-1] == sequence[1::]:
        return True
   else:
        return False

它适用于列表,

  sequence =  [1, 3, 2, 1]
  >>> False

由于您无法删除任何会导致序列增加的数字。但是,如果列表为

sequence: [1, 3, 2]
>>> True

这是正确的,因为您可以删除2或3以增加序列。我的函数虽然错误地输出False。

2 个答案:

答案 0 :(得分:3)

我真的不明白你的第一个主意是什么... 一个更简单的解决方案怎么样?

def fn(seq):
    last_i = None
    lives = 1
    for i in seq :
        if last_i is None :
            last_i = i
        else :
            if (i <= last_i):
                lives = lives - 1
                if (lives < 0) :
                    return False
            last_i = i
    return True

>>> fn([1, 3, 2, 1])
False
>>> fn([1, 3, 2])
True
>>> fn([1, 3, 2, 3])
True
>>> fn([1, 3, 2, 4, 6, 8])
True
>>> fn([1, 3, 2, 4, 6, 8, 2])
False

答案 1 :(得分:0)

下面的代码使用 this answer中编写的单调性检查,并迭代列表中的元素以检查是否弹出单个元素会导致单调性增加。

def strictly_increasing(L):
    return all(x<y for x, y in zip(L, L[1:]))
def non_decreasing(L):
    return all(x<=y for x, y in zip(L, L[1:]))

L = [1, 3, 2]
L_mod = L.copy()
my_bool = False
if not strictly_increasing(L):
    for i, x in enumerate(L):
        L_mod.pop(i)
        if strictly_increasing(L_mod):
            my_bool = True
            exit
        else: L_mod = L.copy()
else:
    my_bool = True

根据需要使用strictly_increasingnon_decreasing