如何替换所有出现但在Python中的一个出现

时间:2016-06-16 20:48:17

标签: python

我有一个长度为gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)的整数列表。

K

我想用a = [0, 0, 0, 1, 1, 5] # length here is 6 替换列表中每个不同值的所有匹配项,除了保持最后一个值不变。我有三个len(a),两个0和一个1。因此,我将5替换两个0(三分之一),6替换1(两分之一)中的两个{/ 1}。

我会得到:

6

保留最后0,最后1和最后5;其他人被列表长度替换。

我试着这样做:

b = [6, 6, 0, 6, 1, 5]

有更简单的方法吗?

3 个答案:

答案 0 :(得分:4)

这是一种方法。使用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

答案 1 :(得分:2)

好吧,如果你喜欢单行:

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]

答案 2 :(得分:1)

如果它不是第一个元素,你保留,我会这样做:

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]