我有一个长度为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]
有更简单的方法吗?
答案 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]