![](/img/trans.png)
[英]How to remove 2nd occurrence of an item in a list using remove() without removing 1st occurrence in Python
[英]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]
使用方法概述:
.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.