Убрать одинаковые значения из списка следующие друг за другом
В списке ниже иногда между разными значения (например 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 шт):
Учебные задачи нужно решать самому. Но поскольку задачка интересная, то предложу решение. Только непонятно, кто такой 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 для текущего элемента, значит это самый первый такой элемент.
попробуйте так:
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]