我有一个列表,我们称它为l = [1,2,3,7,8,9,10,7]。给定该列表l,我尝试不使用内置函数.pop()或.remove()来删除数字7的第一个匹配项。
我尝试过
def remove_item(l, item_to_remove):
newlst = []
for item in l:
if item != item_to_remove:
newlst.append(item)
return newlst
但是,这会删除我尝试删除的项目的所有实例,而实际上我只想删除该特定项目的第一个实例。有没有人提供一些有关如何完成此操作的提示?
答案 0 :(得分:5)
您只需要注意,删除代码的部分就不会运行两次。
lst = [1,2,3,7,8,9,10,7] # [1, 2, 3, 7, 8, 9, 10, 7]
print(lst)
for i in range(len(lst)):
if lst[i] == 7:
del lst[i] # [1, 2, 3, 8, 9, 10, 7]
break
print(lst)
它与以下内容完全相同:
lst = [1,2,3,7,8,9,10,7]
print(lst) # [1, 2, 3, 7, 8, 9, 10, 7]
for i in range(len(lst)):
if lst[i] == 7:
lst.pop(i)
break
print(lst) # [1, 2, 3, 8, 9, 10, 7]
还有这个
lst = [1,2,3,7,8,9,10,7]
print(lst) # [1, 2, 3, 7, 8, 9, 10, 7]
for i in range(len(lst)):
if lst[i] == 7:
lst.remove(lst[i])
break
print(lst) # [1, 2, 3, 8, 9, 10, 7]
使用方法概述:
答案 1 :(得分:2)
.index(x)
返回列表中x
的第一个索引位置,因此只需将其删除即可。如果未找到x
,则返回ValueError
。
my_list = [1, 2, 3, 7, 8, 9, 10, 7]
val = 7
if val in my_list:
del my_list[my_list.index(val)]
>>> my_list
[1, 2, 3, 8, 9, 10, 7]
签名:my_list.index(值,开始= 0,停止= 9223372036854775807,/)
文档字符串: 返回值的第一个索引。
如果不存在该值,则引发ValueError。
答案 2 :(得分:2)
非常浪费,但是在这里,您可以找到一种解决方案:
def remove_first(sequence, element):
return sequence[:sequence.index(element)] + sequence[sequence.index(element)+1:]
然后您可以:
>>> remove_first(["a", "b", "a", "c"], "a"):
['b', 'a', 'c']
index
返回第一次发现元素的索引。
剩下的就是序列拼接和连接。
当然,您可以将其概括为remove(sequence, element, n)
来删除找到的第n个元素。
编辑:我刚刚错误地说index
也支持这一点。声明已删除。
或者您可以选择对输入进行突变,但是,其中之一是,返回输出会更简洁,并且您不能使用一般的“序列”参数,因为并非所有序列都是可变的。请参阅tuple
类型。
答案 3 :(得分:1)
您只需要添加一些逻辑即可。我添加了一个寻找变量,表示我们还没有找到该条目正在寻找。这是代码
def remove_item(l, item_to_remove):
newlst = []
looking = True
for item in l:
if item != item_to_remove or not looking:
newlst.append(item)
else:
looking = False
return newlst
list = [1,3,4,5,6,7,3,10]
print(remove_item(list, 3))
返回[1、4、5、6、7、3、10]
答案 4 :(得分:1)
欢迎使用StackOverflow!
对代码进行了较小的修改。
我希望使用remove
,但这是您修改后的代码来完成所需的工作
def remove_item(l, item_to_remove):
newlst = []
for item in l:
if item != item_to_remove:
newlst.append(item)
else:
return newlst + l[len(newlst) + 1 :]
return newlst
在Python中,您可以添加列表。使用列表推导,您可以选择子列表(l[len(newlst) + 1 :]
)。
测试
>>> list = [1,3,4,5,6,7,3,10]
>>> print(remove_item(list, 3))
[1, 4, 5, 6, 7, 3, 10]
答案 5 :(得分:1)
lst = [1,2,3,7,8,9,10,7]
new_lst = lst[:lst.index(7)] + lst[lst.index(7) + 1:]
new_lst
[1、2、3、8、9、10、7]
答案 6 :(得分:1)
与CEWeinhauer's solution类似的想法,但是一旦发现要删除的项目,它就会利用Python功能来最大程度地减少开销:
def remove_item(l, item_to_remove):
newlst = []
liter = iter(l) # Make single pass iterator, producing each item once
for item in liter:
if item == item_to_remove: # Found single item to remove, we're done
break
newlst.append(item) # Not found yet
newlst += liter # Quickly consume all elements after removed item without tests
return newlst
上面的方法可一次性处理 any 输入,因此最好是输入不是list
和/或很大。但是公认的是更复杂的代码。更简单的解决方案是仅使用index
查找元素并将其删除。在某些情况下,它可能会稍微慢一些,因为它是两个O(n)
步骤,而不是一个步骤,但是它使用了更多的C内置函数,因此在实践中可能会更快:
def remove_item(l, item_to_remove):
newlst = list(l)
del newlst[newlst.index(item_to_remove)]
return newlst