Python - 删除现在小于它们后面的数字的所有数字

时间:2016-08-10 16:40:13

标签: python arrays list

我在我的函数文件中为此创建了一个函数:

Home

我的主程序看起来像:(我使用了removeNum函数,我遇到了代码底部的问题。)

def removeNum(myList):
    listSize = len(myList) -1
    loop = 0
    while loop < listSize:
        if myList[loop] > myList[loop + 1]:
            myList.remove(myList[loop + 1])
            listSize = listSize - 1
        loop = loop + 1

    return myList

当我运行程序时,它不打印出从上面的removeNum函数修改过的新列表,我的函数或主程序有问题吗?我没有收到任何错误。任何想法将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:4)

解决问题的一种方法是zip列表,其副本偏移1,然后使用列表推导过滤,如下所示:

ls = [1, 3, 0, 7, 9, 4]
zipped = zip(ls, ls[0:1] + ls[:-1])
ls_filtered = [p[0] for p in zipped if p[0] >= p[1]]
# ls_filtered is now [1, 3, 7, 9]

答案 1 :(得分:1)

你的功能坏了,看看

>>> removeNum([9, 7, 4, 3, 1, 0])
[9, 4, 1]    

它跳过号码,原因很简单

def removeNum(myList):
    listSize = len(myList) -1
    loop = 0
    while loop < listSize:
        if myList[loop] > myList[loop + 1]:
            myList.remove(myList[loop + 1])
            listSize = listSize - 1
        loop = loop + 1  #<-- here is the problem

    return myList

无论情况如何,你提前loop,当你删除一个元素时不应该这样做,要解决这个问题

def removeNum(myList):
    listSize = len(myList) -1
    loop = 0
    while loop < listSize:
        if myList[loop] > myList[loop + 1]:
            myList.pop(loop + 1) # as the position is know, use pop
            listSize = listSize - 1
        else: 
            loop = loop + 1

    return myList

现在它产生了预期的结果

>>> removeNum([9, 7, 4, 3, 1, 0])
[9]
>>> 

我不建议在适当的位置修改列表,而是使用结果创建一个新的列表,例如

def make_always_growing(iterable):
    current_max = None
    result = []
    for x in iterable:
        if current_max is None or x > current_max:
            current_max = x
            result.append(x)
    return result

这样做的好处是不依赖于iterable作为列表,这使得它更通用并允许它与元组,生成器和其他任何东西一起使用

你的cade的某些行也不需要像

listSum = 0
for numb in finalDataList:
    listSum = listSum + numb

您可以将内置sum用于此

listSum = sum(finalDataList)

functionsFile.firstTen(finalDataList)
functionsFile.lastTen(finalDataList)

如果他们按照名称建议的那样做,那么你可以使用切片来获得

 firstTen = finalDataList[:10]
 lastTen  = finalDataList[-10:]

但由于你没有将结果分配给任何东西,那么你打印出来了吗?

答案 2 :(得分:0)

my_list = [1, 0, 5, 9, 3, 8, 4]
return [item for index, item in enumerate(my_list) if index == 0 or my_list[index] >= my_list[index - 1]]

此代码将迭代my_list,将当前项目与之前的项目进行比较,只考虑之前的项目。