Убрать одинаковые значения из списка следующие друг за другом

В списке ниже иногда между разными значения (например 115.2 и 116.9) встречаются одинаковые друг за другом (напр. 114.2 и 114.2). Нужно из одинаковых оставить последнее, а предыдущие одинаковые заменить на nan.

[nan, nan, 115.4, nan, 115.4, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan, 115.43, nan, nan, nan, nan, 115.43, nan, nan]

Как решить это в одну строчку?

Что должно выйти:

[nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan]

Ответы (2 шт):

Автор решения: CrazyElf

Учебные задачи нужно решать самому. Но поскольку задачка интересная, то предложу решение. Только непонятно, кто такой nan тут, допустим это numpy.nan. Решение дико неэффективное, но в одну строчку, как просили:

from numpy import nan
arr = [nan, nan, 115.4, nan, 115.4, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan, 115.43, nan, nan, nan, nan, 115.43, nan, nan]
print([x if x == nan or arr[::-1].index(x) == i else nan for i,x in enumerate(arr[::-1])][::-1])

Вывод:

[nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan]

Для выяснения, что элемент последний я использую .index, но он ищет с начала, поэтому всё приходится переворачивать - и исходный список, причём два раза, и результирующий тоже. А дальше легко - смотрим, что .index даёт тот же индекс, что enumerate для текущего элемента, значит это самый первый такой элемент.

→ Ссылка
Автор решения: strawdog

попробуйте так:

from numpy import nan
import pandas as pd
a = [nan, nan, 115.4, nan, 115.4, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan, 115.43, nan, nan, nan, nan, 115.43, nan, nan]
s = pd.Series(a).fillna(method="bfill")
s[s == s.shift(-1)]=nan
a = s.tolist()

теперь a:

[nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan]
→ Ссылка