[英]Remove next elements from list in python
我有一個如下所示的列表:
['ABC ', '02:20', 123456, 123, '-', 123456, 123, 'DEF ', '-', 123456, 123, '-', 123456, 123, 'IFG', '-', 123456, 123, '-', 123456, 123, 'IJK', '03:40', 123456, 123, '-', 123456, 123, 'LOM', '-', 123456, 123, '03:00', 123456, 123]
如何根據條件刪除下兩個元素以及當前元素?
比如我想刪除-
以及接下來的 2 個元素
for idx, val in enumerate(n1):
if val == '-':
del n1[idx]
del n1[idx+1]
del n1[idx+2]
n1 = n1
但只有-
從列表中刪除
第一個問題是,在執行del n1[idx]
,下一個值,以前在idx+1
現在在位置idx
因為它向前移動了,所以要刪除 3 個連續的元素,代碼將
del n1[idx] del n1[idx] del n1[idx] # OR del n1[idx:idx+3]
但是當您在刪除時進行迭代時,您會錯過元素,並且您的代碼將返回以下內容,完成了 5 次刪除,但有 2 次未命中
['ABC ', '02:20', 123456, 123, 'DEF ', '-', 123456, 123, 'IFG', '-', 123456, 123, 'IJK', '03:40', 123456, 123, 'LOM', '03:00', 123456, 123]
一個解決方案是不迭代,而是檢查並刪除直到沒有'-'
while '-' in n1:
idx = n1.index('-')
del n1[idx:idx + 3]
您可以通過以下方式從列表中刪除元素,
del n1[idx:idx+2]
每次執行del n1[idx]
,都會從列表中刪除一個元素,因此刪除后的所有元素的索引都會改變。
因此,下面的del n1[idx+1]
將刪除錯誤的元素。
為避免這種情況,您可以按索引的降序刪除元素:
del n1[idx+2]
del n1[idx+1]
del n1[idx]
(當然,您應該檢查idx+2
和idx+1
是否仍在列表范圍內)。
只需循環並根據您的邏輯創建一個新列表。 見下文
lst = ['ABC ', '02:20', 123456, 123, '-', 123456, 123, 'DEF ', '-', 123456, 123, '-', 123456, 123, 'IFG', '-', 123456,
123, '-', 123456, 123, 'IJK', '03:40', 123456, 123, '-', 123456, 123, 'LOM', '-', 123456, 123, '03:00', 123456,
123]
idx = 0
lst1 = []
while idx < len(lst) - 1:
if lst[idx] == '-':
idx += 3
else:
lst1.append(lst[idx])
idx += 1
print(lst1)
輸出
['ABC ', '02:20', 123456, 123, 'DEF ', 'IFG', 'IJK', '03:40', 123456, 123, 'LOM', '03:00', 123456]
不優雅但有效且易於理解,如果數據集很大,可以很容易地與 numba 一起使用。
n1 = ['ABC ', '02:20', 123456, 123, '-', 123456, 123, 'DEF ', '-', 123456, 123, '-', 123456, 123, 'IFG', '-', 123456, 123, '-', 123456, 123, 'IJK', '03:40', 123456, 123, '-', 123456, 123, 'LOM', '-', 123456, 123, '03:00', 123456, 123]
skip = 0
result = []
for idx, val in enumerate(n1):
if val == '-':
skip = 3
else:
skip -= 1
if skip <= 0:
result.append(val)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.