簡體   English   中英

如何用Python替換所有出現的事件

[英]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.

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