簡體   English   中英

如何在不使用.pop()或.remove()的情況下從項目列表中刪除特定項目的第一次出現

[英]How to remove first occurrence of a specific item from a list of items without using .pop() or .remove()

我有一個列表,我們稱它為 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

但是,這會刪除我要刪除的項目的所有實例,而實際上我只想刪除該特定項目的第一個實例。 有沒有人有一些關於如何做到這一點的提示?

您只需要注意代碼的刪除部分不會運行兩次。

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 - 刪除第一次出現的 value。如果 value 不存在,則引發 ValueError。

.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(value, start=0, stop=9223372036854775807, /)

Docstring:返回值的第一個索引。

如果值不存在,則引發 ValueError。

很浪費,不過給你go,一個解決辦法:

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返回第一個找到的元素的索引。 rest 是序列拼接和連接。

當然,您可以將其概括為remove(sequence, element, n)以刪除第 n 個找到的元素。 編輯:我只是錯誤地說index也支持這一點。 已刪除聲明。

或者您可以選擇改變輸入,但一方面,返回 output 更干凈,並且您不能有一個通用的“序列”參數,因為並非所有序列都是可變的。 查看tuple類型。

您只需要為其添加一點邏輯即可。 我添加了一個查找變量,表示我們還沒有找到要查找的條目。 這是代碼

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]

歡迎來到 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 中,您可以添加列表。 使用列表推導,你 select 子列表( 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]
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]

CEWeinhauer 的解決方案類似的想法,但是一旦我們找到要刪除的項目,它利用 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

以上內容適用於任何一次可迭代的輸入,因此最好輸入可能不是list和/或可能很大。 但它無疑是更復雜的代碼。 更簡單的解決方案是找到具有index的元素並將其刪除。 在某些情況下它可能會稍微慢一些,因為它是兩個O(n)步驟而不是一個,但它使用 C 內置更多,因此在實踐中它可能會更快:

 def remove_item(l, item_to_remove):
     newlst = list(l)
     del newlst[newlst.index(item_to_remove)]
     return newlst

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM