我試圖從串列中洗掉相鄰的重復項,而不使用像 del 或 remove 這樣的串列突變。下面是我試過的代碼:
def remove_dups(L):
L = [x for x in range(0,len(L)) if L[x] != L[x-1]]
return L
print(remove_dups([1,2,2,3,3,3,4,5,1,1,1]))
這輸出:
[1, 3, 6, 7, 8]
誰能解釋一下這個輸出是如何發生的?我想了解流程,但即使在 VS 代碼中進行除錯,我也無法做到。
輸入:
[1,2,2,3,3,3,4,5,1,1,1]
預期輸出:
[1,2,3,4,5,1]
uj5u.com熱心網友回復:
我將替換變數以使其更具可讀性
def remove_dups(L):
L = [x for x in range(0,len(L)) if L[x] != L[x-1]]
變成:
def remove_dups(lst):
return [index for index in range(len(lst)) if lst[index] != lst[index-1]]
您可以看到,不是遍歷串列的專案,而是遍歷陣列的索引,將一個索引lst[index]處的值與前一個索引處的值進行比較,lst[index-1]并且僅在它們不匹配時遷移/復制該值
兩個主要問題是:
- 它比較的第一個索引是
-1串列的最后一項(與第一個相比) - 這實際上是回傳非重復項的索引。
為了完成這項作業,我將使用 enumerate 函式回傳專案及其索引,如下所示:
def remove_dups(lst):
return [item for index, item in enumerate(lst[:-1]) if item != lst[index 1]] [lst[-1]]
在這里,我正在做的是回圈遍歷除最后一個之外的所有專案[:-1]并檢查該專案是否與下一個專案匹配,如果不匹配則僅添加它
最后,由于未讀取最后一個值,我們將其附加到 output [lst[-1]]。
uj5u.com熱心網友回復:
這是一份作業itertools.groupby:
from itertools import groupby
def remove_dups(L):
return [k for k,g in groupby(L)]
L2 = remove_dups([1,2,2,3,3,3,4,5,1,1,1])
輸出: [1, 2, 3, 4, 5, 1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322696.html
上一篇:for回圈完成后設定回值
