此功能的目的是删除列表中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]
答案 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