当next()仅应跳过实际项目时,它会跳过列表中的实际项目和下一项目

时间:2019-07-16 17:03:44

标签: python python-3.x list loops iterator

我正在编写一个程序,该程序给出一个整数列表,确定最小值,然后使用列表的次要索引删除最小值。

例如:list = [3、6、15、2、4、2]应返回[3、6、15、4、2] 请注意,由于列表中的次要索引,前2个已删除。

这是我的完整代码:

def remove_smallest(numbers):
    mylist = []
    if not numbers:
        return mylist 
    minimo = min(numbers)
    if numbers.count(minimo) > 1:
        numbers = numbers[::-1] #My solution to the minor index is to reverse the list and loop. Then reverse again.

        #mylist = [item for item in numbers if item != minimo and item not in mylist]  #I tried to use a list comprehension, with awful results.

        it = iter(numbers)
        for item in it:
            if item == minimo and item in mylist:
                next(it, None)
                continue
            mylist.append(item)

    print(mylist[::-1])

remove_smallest([2, 4, 5, 1, 2, 1])

前两项将附加到“ mylist”(1、2)。 然后,因为1在mylist上,它将跳过它,然后继续。到目前为止,还不错,但是当它应该选择5时,它不会,而是直接转到4然后是2,导致在程序结尾处看起来像这样的数组:[2,4,2,1 ]应该何时返回[2,4,5,2,1]

谢谢

4 个答案:

答案 0 :(得分:2)

删除下一条语句可使代码按预期方式工作。 for循环已经在迭代器上调用了下一个,因此无需手动进行。

def remove_smallest(numbers):
    mylist = []
    if not numbers:
        return mylist 
    minimo = min(numbers)
    if numbers.count(minimo) > 1:
        numbers = numbers[::-1] #My solution to the minor index is to reverse the list and loop. Then reverse again.

        it = iter(numbers)
        for item in it:
            if item == minimo and item in mylist:
                continue
            mylist.append(item)

    print(mylist[::-1])

remove_smallest([2, 4, 5, 1, 2, 1])

结果:

[2, 4, 5, 2, 1]

答案 1 :(得分:2)

一个简单的语句将删除最小值。 l.index(min(l))找到最小值的索引。

>>> l = [2,4,5,1,2,1]
>>> del l[l.index(min(l))]
>>> l
[2, 4, 5, 2, 1]

答案 2 :(得分:1)

我将设计一种新方法,因为我发现您的代码太多:

def remove_smallest(lst):
    mini = min(lst)
    indx = next((i for i, x in enumerate(lst) if x == mini), -1)
    del lst[indx]
    return lst

可安全删除列表中最小元素的首次出现。

用法

>>> remove_smallest([2, 4, 5, 1, 2, 1])
[2, 4, 5, 2, 1]

答案 3 :(得分:1)

此函数将删除列表中第一个出现的最小数字并返回该数字,该列表已就地修改,因此无需返回:

def pop_smallest(lst):
    smallest = lst.index(min(lst))
    return lst.pop(smallest)

l = [2, 4, 5, 1, 2, 1]
pop_smallest(l)
>>> 1

l
>>> [2, 4, 5, 2, 1]

但是如果您不想修改原始列表,则需要复制列表并返回新列表

def pop_smallest(lst):
    new_lst = lst.copy()
    smallest = new_lst.index(min(lst))
    new_lst.pop(smallest)
    return new_lst

l = [2, 4, 5, 1, 2, 1]
new_l = pop_smallest(l)

l
>>> [2, 4, 5, 1, 2, 1]
new_l
>>> [2, 4, 5, 2, 1]