[英]How to replace all the occurences but one in Python
我有一個長度為K
的整數列表。
a = [0, 0, 0, 1, 1, 5] # length here is 6
我想用len(a)
替換列表中每個不同值的所有出現,除了保持最后一個值不變。 我有三個0
,兩個1
和一個5
。 所以,我會替代兩個0
的(出三) 6
,一個1
的(出2) 6
,僅此而已。
我會得到:
b = [6, 6, 0, 6, 1, 5]
最后0,最后1和最后5被保留; 其他被列表長度代替。
我試圖這樣做:
a = [0, 0, 0, 1, 1, 5]
xx = [[i for i, x in enumerate(a) if x == e] for e in range(len(a))]
for i in range(len(a)):
if len(xx[i]) > 1:
for j in range(len(xx[i]) - 1):
a[xx[i][j]] = len(a)
有沒有更簡單的方法可以做到這一點?
這是一種方法。 使用dict prev
跟蹤先前看到的值的索引。 如果我們已經看過,則將其更改為6:
a = [0, 0, 0, 1, 1, 5]
prev = {}
for i in range(len(a)):
if a[i] in prev:
a[prev[a[i]]] = len(a)
prev[a[i]] = i
print a
好吧,如果您希望以單線方式使用它:
a = [len(a) if val==a[i+1] else val \
for i, val in enumerate(a[:-1])] + [a[-1]]
對於每個元素,檢查其是否等於后一個(假定a在列表中具有所有相等的連續值)。 如果是這樣,請選擇列表長度。 否則為當前值。 對除最后一個元素(我們僅將其連接在一起)之外的所有元素執行此操作。
輸出:
[6, 6, 0, 6, 1, 5]
如果您不必保留第一個元素,則可以這樣做:
seen = []
for i, elm in enumerate(a):
if elm in seen:
a[i] = len(a)
else:
seen.append(elm)
del seen
這產生
[0, 6, 6, 1, 6, 5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.