Python-删除列表中前两个出现的元素

时间:2020-05-27 18:36:08

标签: python

此功能的目的是删除列表中n的前两次出现。

以下是我编写的代码,但许多小时后仍然出错。一位朋友劝我不要在迭代时编辑列表。但是,我仍然被卡住。

def remove_first_two(list,n):
    if list == []:
        return []
    else:
        count = 0
        for ele in list:
            if ele == n:
                list.remove(ele)
                count += 1
                if count == 2:
                    break
    return list

list = [1,2,2,3]
print(remove_first_two(list,2)) => [1,2,3] instead of [1,3]

8 个答案:

答案 0 :(得分:2)

Beautifulsoup与try-except一起使用两次。这将删除前两个条目。复杂性list.remove

O(n)

答案 1 :(得分:1)

您可以尝试查找所有索引和del:

a = [1,2,3,2,3,2,4]
indices = [i for i, x in enumerate(a) if x == 2]
print(indices)

[1, 3, 5]
del a[indices[0]], a[indices[1]]
print(a)

[1, 3, 2, 2, 4]

答案 2 :(得分:0)

首先,不要在Python中使用“列表”作为关键字。使用其他东西,例如“ alist”。 下面的代码实现了您想要的,并保留了已有内容的基本形式。当然,您也可以使用内置的.remove()方法。

def remove_first_two(alist, n):
    if alist == []:
        return []
    else:
        count = 0
        while count < 2:
            for ele in alist:
                if ele == n:
                    alist.remove(ele)
                    count += 1
    return alist

alist = [1,2,2,3]
print(remove_first_two(alist,2)) # Output -> [1,3]

答案 3 :(得分:0)

当您的朋友说“迭代时不要编辑列表”时,他/她是对的,他/她的意思是您应该一起创建另一个列表。您要执行的操作如下:

def remove_first_two(list, n):
    if list == []:
        return []
    else:
        new_list = []
        count = 0
        for ele in list:
            if ele == n:
                if count >= 2:
                    new_list.append(ele)

                count += 1
            else:
                new_list.append(ele)

    return new_list

但是,请注意,您可以使用一些内置函数使您的生活更轻松:

list.remove(x)

从列表中删除值等于x的第一项。如果没有此类项目,则会引发ValueError。

因此,您可以更简单地执行操作:

def remove_first_two(list, n):
    if list == []:
        return []

    for _ in range(2):
        if n in list:
            list.remove(n)

    return list

答案 4 :(得分:0)

如果在迭代时更改列表,Python将更新列表。

在您用list = [1,2,2,3]进行测试的情况下,删除了list[1] Python更新 list = [1,2,3]。现在,Python知道您已经迭代到索引1,然后从现在包含3的索引2开始。因此,Python仅遇到 2次出现

因此,请听取朋友的建议,并且不要在迭代时编辑列表:)

现在,您可以使用Python的内置list.remove(element)来删除元素的第一次出现。重复2次以获得所需的输出。

答案 5 :(得分:0)

也有一个解析的O(n)。

str_suffix

答案 6 :(得分:0)

这也可以在python 3.8中使用列表理解中的赋值表达式来完成:

data = [1,2,3,2,3,2,4]

count = 2
num = 2

[x for x in data if x != num or (count:=count-1) < 0]

结果:

[1, 3, 2, 2, 4]

答案 7 :(得分:0)

这是您的程序无法运行的原因: 当您删除元素时,for循环将移至下一个元素,但是通过“移至”,实际上是跳过了该元素,该元素现在占据了已删除元素的位置。它会在您删除元素之后立即跳过该元素。

在删除元素时迭代列表的正确方法是通过使用while循环而不是for循环来使索引进行显式显示,而在删除元素时不增加索引:

i = 0 
while i < len(my_list):
    if condition:
        my_list.pop(i)
    else:
        i += 1

但是,在您的情况下,这些都不是必需的!请注意,使用my_list.remove(ele)时并没有像使用my_list.pop(i)那样提供索引,因此Python必须搜索与ele匹配的第一个元素。尽管remove单独使用时会比pop慢,但是这里remove允许您根本不使用任何循环,只需执行my_list.remove(n)两次!

最后一次触摸:如果列表中少于两个匹配n的元素,则两个my_list.remove(n)命令之一将返回ValueError。您可以解决此异常,只要知道它发生了,您的列表就准备好了,不需要采取进一步的措施。

所以您需要的代码是:

try:
    my_list.remove(n)
    my_list.remove(n)
except ValueError:
    pass