如何在不使用.pop()或.remove()的情况下从项目列表中删除特定项目的首次出现

时间:2019-10-22 18:42:25

标签: python list

我有一个列表,我们称它为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

但是,这会删除我尝试删除的项目的所有实例,而实际上我只想删除该特定项目的第一个实例。有没有人提供一些有关如何完成此操作的提示?

7 个答案:

答案 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. del list[i]-del语句还可用于从列表中删除切片
  2. list.pop-删除并返回索引处的项目(默认为倒数)。如果列表为空或索引超出范围,则引发IndexError。
  3. list.remove-删除第一次出现的值。如果不存在该值,则引发ValueError。

答案 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
相关问题