Python 查找下一个元素是否小于前一个元素,并将其从列表中删除

Python 查找下一个元素是否小于前一个元素,并将其从列表中删除,python,Python,我的代码有问题,我正在编写一个方法,该方法将检查下一个元素是否比上一个元素小,如果是,它将删除它 例如: 输入:[1,20,10,30] def findSmaller(s): i = -1 y = [] while i <= len(s): for j in range(len(s)): if s[i+1] <= s[i]: del s[i + 1] y.

我的代码有问题,我正在编写一个方法,该方法将检查下一个元素是否比上一个元素小,如果是,它将删除它

例如:

输入:
[1,20,10,30]

def findSmaller(s):
    i = -1
    y = []
    while i <= len(s):
        for j in range(len(s)):
            if s[i+1] <= s[i]:
                del s[i + 1]
                y.append(s[i])
            i += 1
            return y
所需输出:
[1,20,30]

def findSmaller(s):
    i = -1
    y = []
    while i <= len(s):
        for j in range(len(s)):
            if s[i+1] <= s[i]:
                del s[i + 1]
                y.append(s[i])
            i += 1
            return y
实际输出:
[30]

def findSmaller(s):
    i = -1
    y = []
    while i <= len(s):
        for j in range(len(s)):
            if s[i+1] <= s[i]:
                del s[i + 1]
                y.append(s[i])
            i += 1
            return y
def findSmaller(s):
i=-1
y=[]

而我你可以试试这样的东西

def findSmaller(s):
    # sets p (previous) as the first value in s
    p = s[0]
    # initializes y to be an array and sets the first value to p
    y = [p]
    # iterates over s, starting with the second element
    for i in s[1::]:
        # checks if i is greater than or equal to the previous element
        if i >= p:
            # if it is, i is appended to the list y
            y.append(i)
            # also set the previous value to i, so the next iteration can check against p
            p = i
    #returns the list
    return y
这样做的目的是迭代
s
,检查列表中的当前项是否大于或等于列表中的上一个元素。如果是,则将其附加到
y
,并返回
y


试用代码。

如果您不确定循环如何工作,我建议添加一些打印语句。通过这种方式,您可以看到您的循环实际在做什么,尤其是在更复杂的问题中,这非常有用

这样的事情可以解决你的问题

a = [1,2,3,2,4]
for k in range(0,len(a)-2): #-2 so that one don't go past the loops length
    #print(k)
    y = a
    if(a[k]>a[k+1]):
        del y[k+1] #delete the k+1 element if it is 

根据以后是否需要使用列表进行计算,可以使用生成器

s = [1, 20, 10, 30]

def find_smaller_generator(l: list):
    last_item = None
    for item in l:
        if last_item is None or item >= last_item: 
            last_item = item
            yield item
def find_smaller_list(l: list):
    return list(find_smaller_generator(l))



print(find_smaller_list(s))

for i in find_smaller_generator(s):
    print(i)

print([i**2 for i in find_smaller_generator(s)])
这将返回:

[1, 20, 30]

1
20
30

[1, 400, 900]

这是你的实际缩进吗?您不希望return语句只缩进一级吗?不要迭代并更改列表。这是错误的。你是什么意思?@BlueMonday列表在python中是可变的,因此
s
在方法运行后会发生变化。如果有两个项目比前一个小,例如
[30,20,25]
,你希望它是
[30]
还是
[30,25]
?你能告诉我y=[p]意思是?这将创建一个列表,其中
y
是列表中的第一个元素。@BlueMonday我注释了代码中的每一行来解释它。@BlueMonday我刚刚更改了它,它就是这样做的。现在试试看。我提供了一个链接。我不会得到一个索引超出范围的错误吗?编辑:我想不是,我现在明白了,谢谢你提供的信息,谢谢。这至少是一个简单的解释。只有一个有趣的变量,我相信它的名字很好。